我正在尝试开发一个像记事本一样的查找和替换功能。这是到目前为止我的查找代码。我想知道如何在按下按钮后保持对话框打开,以便我可以使用该对话框进行下一次查找。
import java.awt.BorderLayout;
import java.awt.event.*;
import java.io.FileInputStream;
import java.io.FileReader;
import java.util.Scanner;
import javax.swing.*;
class TextAreaEx extends JFrame implements ActionListener, KeyListener {
JButton button1;
JTextArea tx = new JTextArea();
int startFrom = 0;
int offset = 0;
String find = "";
String text = "";
TextAreaEx() {
super("My Frame");
FileInputStream fis = null;
StringBuffer sb = new StringBuffer();
try {
Scanner scan = new Scanner(new FileReader("C:\\Users\\Sam\\Desktop\\networktools.txt"));
while (scan.hasNext()) // while there's still something to read
{
tx.append(scan.nextLine() + "\n"); // append
}
} catch (Exception e) {
e.printStackTrace();
}
// text = sb.toString();
text = tx.getText();
text = text.toLowerCase();
button1 = new JButton("Find");
button1.addActionListener(this);
getContentPane().add(button1, BorderLayout.PAGE_START);
button1.setFocusable(false);
JScrollPane p1 = new JScrollPane(tx);
getContentPane().add(p1);
JFrame.setDefaultLookAndFeelDecorated(true);
tx.addKeyListener(this);
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(400, 300);
setVisible(true);
}
public static void main(String s[]) {
new TextAreaEx();
}
public void actionPerformed(ActionEvent e) {
startFrom = 0;
offset = 0;
if (e.getSource() == button1) {
find = (String) JOptionPane.showInputDialog(this, "FIND:\n", "Find", JOptionPane.INFORMATION_MESSAGE, null, null, null);
find = find.toLowerCase();
findWord();
this.setVisible(true);
}
}
public void findWord() {
offset = text.indexOf(find, startFrom);
if (offset > -1) {
tx.setFocusable(true);
tx.select(offset, find.length() + offset);
startFrom = find.length() + offset + 1;
} else {
JOptionPane.showMessageDialog(this, "No (more) matches");
}
}
public void keyPressed(KeyEvent ke) {
if (ke.getKeyCode() == KeyEvent.VK_F3) {
findWord();
}
}
public void keyReleased(KeyEvent ke) {
}
public void keyTyped(KeyEvent ke) {
}
}
感谢您的帮助。
最佳答案
JOptionPane 只是用来询问一个简单的问题,让用户回答是/否、确定/取消,或者要求简单的输入然后关闭。 “真正的”查找/替换对话框需要做的比这多得多,不要尝试为此使用 JOptionPane,它不是为此目的而设计的。 您将需要完整的新对话框(在您的情况下是 JFrame)来完成您所需要的,并且您将能够扩展它以指定其他选项,如“匹配大小写”、使用正则表达式等。
注意:除此之外,您的代码还需要很多其他改进。首先不使用硬编码的魔数(Magic Number)和字符串,适本地命名变量(而不是 button1 ),遵守您所使用的语言的编码和格式约定。尝试使用只做一件事的较小的类和方法 - “一个类应该有一个且只有一个改变的理由”。尝试将搜索功能本身提取到自己的类中,并为其编写单元测试。 一段时间后,您可以尝试查看一些开源 Java 项目(JEdit 是编辑器的一个很好的例子),看看专业代码是什么样子的。 祝你好运。
关于java - 查找和替换对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233301/