对于学校,我尝试使用Java的Swing重新创建Microsoft的记事本程序。我正在处理保存和打开.txt文件的问题,我试图找出一种方法,让程序检测何时对文档进行了更改。如果检测到更改并且用户选择打开或创建新文件,我希望程序在继续之前提示用户是否要保存更改。
我的想法是创建一个名为documentChanged
的标志,该标志最初为假,并且只要对JTextArea
进行了更改,就会设置为true。为了检测这种变化,我考虑使用TextListener
如下:
public class JNotepad implements ActionListener
{
boolean documentChanged;
JTextArea notepad;
JNotepad()
{
documentChanged = false;
notepad = new JTextArea();
notepad.addTextListener(new TextListener() {
public void textValueChanged(TextEvent te) {
documentChanged = true;
}
});
}
}
但是,我了解到Java类无法同时实现多个接口,而且我已经使用ActionListener
来实现记事本菜单栏中的项目。
我的问题是,有没有办法在同一个班级同时使用TextListener
和ActionListener
(或任何其他听众)?如果没有,那么检测文件变更的最佳行动计划是什么?
答案 0 :(得分:3)
这是另一篇文章的回答。见Text Changed event in JTextArea? How to?
另请参阅Oracle中的How to Write a Document Listener(DocumentListener
),您将看到一个applet示例。
答案 1 :(得分:2)
你如何编译
notepad = new JTextArea();
notepad.addTextListener(new TextListener() {
// ....
}
因为TextListeners没有定义为使用JTextAreas而是使用TextAreas,这是一个完全不同的野兽。
您应该将DocumentListener添加到JTextArea的文档中。
notepad.getDocument().addDocumentListener(new DocumentListener() {
void insertUpdate(DocumentEvent e) {
documentChanged = true;
}
void removeUpdate(DocumentEvent e) {
documentChanged = true;
}
void changedUpdate(DocumentEvent e) {
documentChanged = true;
}
});
关于
我的问题是,有没有办法在同一个类中同时使用TextListeners和ActionListeners(或任何其他侦听器)?
使用DocumentListener与程序中其他地方使用的ActionListener无关,因为它们的域彼此正交,即一个与另一个完全无关。