我正在尝试在记事本中开发一个查找和替换。到目前为止,这是我的代码。我想知道按下按钮后如何保持对话框打开,以便我可以使用该对话框进行下一次查找。
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) {
}
}
感谢您的帮助。
答案 0 :(得分:6)
JOptionPane只是用于提出一个简单的问题,用户可以回答是/否,确定/取消或者询问简单输入而不是关闭。 “真正的”查找/替换对话框需要做的远不止这些,不要尝试使用JOptionPane,它不是为此目的而设计的。 您将需要完整的新对话框(在您的情况下为JFrame),它可以完成您的需要,并且您将能够扩展它以指定其他选项,如“匹配大小写”,使用正则表达式等。
注意:除此之外,您的代码还需要很多其他改进。首先不使用魔术数字和硬编码的字符串,适当地命名变量(而不是button1),坚持使用您正在使用的语言的编码和格式约定。尝试使用较小的类和方法只做一件事 - “一个类应该有一个,只有一个,有理由改变”。尝试在其自己的类中提取搜索功能本身并为其编写单元测试。 一段时间后,您可以尝试查看一些开源Java项目(JEdit是编辑器的好例子),看看专业代码的样子。 祝你好运。