如何在关闭 jframe 之前询问我是否保存了我的文本文档

How to ask if I have saved my text document before closing the jframe

我正在开发一个文本编辑器,我需要检查我是否在我的文本区中保存了输入的机会(甚至 space)。

即使我输入了 space,对话框也会弹出并要求我在关闭应用程序之前保存文本。

我需要以单一方式定义所有键,而不检查是否按下所有键盘键...这是我的代码:

 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.
        }
    });
}

想要监听关键事件。

相反,您想在 class 中跟踪一个 "unsaved property",它环绕着您的不同组件。任何时候用户对编辑器进行 any 更改(更具体地说是对基础 model 对象);您将 属性 设置为 true.

每次用户保存,你​​把属性变成false

每当用户告诉应用程序关闭时,您检查 属性,如果是 true - 您询问用户是否要保存。

不要不要进入"one action"直接触发另一个模式的模式。

编辑:只是为了说明这一点 - 属性 我的意思是你添加一个 字段 到你的 class,非常像 isModified 其他答案已经暗示了。

如果我没理解错的话,你问的是如何检测 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) 保留原始文档的副本,并在框架即将关闭时比较两者。如何执行此操作在一定程度上取决于您拥有的文档类型。如果是HTML文档,那么比较实际的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) 的优点是您不必检查每个编辑操作(虽然在大多数情况下其开销可以忽略不计)并且您可以准确地检测到更改何时被还原(例如用户添加文本,然后删除该文本,或者已执行撤消)。