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

时间:2017-03-29 08:13:53

标签: java swing jtextarea key-events

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

如果我输入了一个空格,则会弹出对话框并要求我在关闭应用程序之前保存文本。

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

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

2 个答案:

答案 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