我正在开发一个文本编辑器,我需要检查是否在文本区域中保存了键入的机会(甚至是空格)。
如果我输入了一个空格,则会弹出对话框并要求我在关闭应用程序之前保存文本。
我需要以单一方式定义所有键而不检查是否按下所有键盘键...这是我的代码:
private void isAnyKeyWasPressed() {
jTextPane1.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyChar()==e.VK_0 || e.getKeyChar()==e.VK_1) {//need to define all the keyboard keys without defining one by one like this
//my dialog box goes here
}
}
@Override
public void keyPressed(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void keyReleased(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
}
答案 0 :(得分:3)
如果我理解正确,您就会询问如何检测JTextPane
中的文档是否已编辑。听键不是最佳选择。我宁愿推荐以下两种方式之一:
A)听取对基础文件的更改:
jTextPanel.getDocument().addDocumentListener(new DocumentListener(){
@Override
public void changedUpdate(DocumentEvent e) {
isModified=true;
}
@Override
public void insertUpdate(DocumentEvent e) {
isModified=true;
}
@Override
public void removeUpdate(DocumentEvent e) {
isModified=true;
}
});
字段isModified
必须初始化为false
,并且只要文档以任何方式更改,就会设置为true
。保存后必须将其重置为false。
B)保留原始文件的副本,并在框架即将关闭时进行比较。如何执行此操作取决于您拥有的文档类型。如果它是HTMLDocument,那么比较实际的HTML源代码是最准确的方法:
开始编辑之前:
HTMLDocument doc=(HTMLDocument)jTextPanel.getDocument();
String originalHtml=getHTML(doc);
编辑/关闭框架后:
HTMLDocument doc=(HTMLDocument)jTextPanel.getDocument();
String editedHtml=getHTML(doc);
if(!editedHtml.equals(originalHtml))
// ... text has been edited
getHTML()
方法:
public String getHTML(HTMLDocument doc){
StringWriter writer = new StringWriter();
kit.write(writer, doc, 0, doc.getLength());
return writer.toString();
}
方法B)的优点是您不必检查每个编辑操作(在大多数情况下其开销可以忽略不计),并且您可以准确地检测何时还原了更改(例如用户)添加了文本,然后删除了该文本,或者已执行撤消操作。)
答案 1 :(得分:1)
你不想要听取关键事件。
相反,您希望跟踪包含不同组件的类中的“未保存属性”。用户随时对编辑器进行任何更改(更具体地说,是对基础 model 对象);您将该属性设置为true
。
每次用户保存时,都会将属性设置为false
。
每当用户告诉应用程序关闭时,您检查该属性,如果它是true
- 您询问用户是否要保存。
不进入“一个动作”直接触发另一个动作的模式。
编辑:只是为了清楚 - 使用属性我的意思是你在课堂上添加字段,非常类似于另一个答案已经建议的isModified
。