java编写的GUI 怎么实现查找功能(使用搜索栏搜索) 还是这个问题
我把你给的代码改了一下importjavax.swing.JTextField;importjava.awt.Dimension;importjavax.swing.JB...
我把你给的代码改了一下
import javax.swing.JTextField;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JTextPane;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.BadLocationException;
import javax.swing.JOptionPane;
public class SearchBar extends JTextField
{
JButton searchButton;
JTextField textField;
JTextPane text=null;
public SearchBar(JTextPane text){
//super("used for searching",20);
//setPreferredSize(new Dimension(10, 300)); //the latter
//setSize(400,400);
searchButton = new JButton(new ImageIcon("search.png"));
searchButton.setToolTipText("Click to search");
//searchButton.addActionListener();
textField = new JTextField("used for searching",20);
this.text=text;
}
public JButton getSearchButton(){
return searchButton;
}
public JTextField getSearchBar(){
return textField;
}
public void myAction(){
String textInText = text.getText();
String keyword = textField.getText();
//System.out.printf("%s",textInText);
//System.out.printf("%s",keyword);
int index = textInText.indexOf(keyword);
if (index != -1) {
text.getHighlighter().removeAllHighlights();
try {
while (index != -1 & !keyword.equals("") ) {
text.getHighlighter().addHighlight(index, index + keyword.length(), DefaultHighlighter.DefaultPainter);
index = textInText.indexOf(keyword, index + keyword.length());
}
}
catch (BadLocationException ex) {
ex.printStackTrace();
}
}
else
JOptionPane.showMessageDialog(SearchBar.this,"Can't find keyword:" + keyword);
}
}
但现在出现的问题是,高亮的显示有一些偏差。比如第二行有12345678,我搜索1234,高亮的是2345。第一行没有偏差,从第二行开始越往下偏差越严重。怎么解决呢?再次谢谢你啊! 展开
import javax.swing.JTextField;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JTextPane;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.BadLocationException;
import javax.swing.JOptionPane;
public class SearchBar extends JTextField
{
JButton searchButton;
JTextField textField;
JTextPane text=null;
public SearchBar(JTextPane text){
//super("used for searching",20);
//setPreferredSize(new Dimension(10, 300)); //the latter
//setSize(400,400);
searchButton = new JButton(new ImageIcon("search.png"));
searchButton.setToolTipText("Click to search");
//searchButton.addActionListener();
textField = new JTextField("used for searching",20);
this.text=text;
}
public JButton getSearchButton(){
return searchButton;
}
public JTextField getSearchBar(){
return textField;
}
public void myAction(){
String textInText = text.getText();
String keyword = textField.getText();
//System.out.printf("%s",textInText);
//System.out.printf("%s",keyword);
int index = textInText.indexOf(keyword);
if (index != -1) {
text.getHighlighter().removeAllHighlights();
try {
while (index != -1 & !keyword.equals("") ) {
text.getHighlighter().addHighlight(index, index + keyword.length(), DefaultHighlighter.DefaultPainter);
index = textInText.indexOf(keyword, index + keyword.length());
}
}
catch (BadLocationException ex) {
ex.printStackTrace();
}
}
else
JOptionPane.showMessageDialog(SearchBar.this,"Can't find keyword:" + keyword);
}
}
但现在出现的问题是,高亮的显示有一些偏差。比如第二行有12345678,我搜索1234,高亮的是2345。第一行没有偏差,从第二行开始越往下偏差越严重。怎么解决呢?再次谢谢你啊! 展开
展开全部
最近都没怎么来这里 不好意思这么久才回你
我猜你测试的时候是键入的这些内容
是这样的:
在我们键入回车键的时候,实际上生成的是两个字符:一个是换行键(ASCII码13),一个是回车键(ASCII码10)
然后用indexOf查找的时候 每多一个回车 实际上多出一个字符
而在highlighter 渲染的时候 会认为这两个字符是一个字符
所以就会每行下错一个
把你的这行:
String textInText = text.getText();
改成:
String textInText = text.getText().replaceAll(String.valueOf((char) 13), "");
text.setText(textInText);
这样就可以了
暂时怀疑这是HighLighter的bug 等我腾出时间来仔细看看类库里边怎么写的吧
我猜你测试的时候是键入的这些内容
是这样的:
在我们键入回车键的时候,实际上生成的是两个字符:一个是换行键(ASCII码13),一个是回车键(ASCII码10)
然后用indexOf查找的时候 每多一个回车 实际上多出一个字符
而在highlighter 渲染的时候 会认为这两个字符是一个字符
所以就会每行下错一个
把你的这行:
String textInText = text.getText();
改成:
String textInText = text.getText().replaceAll(String.valueOf((char) 13), "");
text.setText(textInText);
这样就可以了
暂时怀疑这是HighLighter的bug 等我腾出时间来仔细看看类库里边怎么写的吧
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询