文本编辑器java Swing actionListener保存文件

时间:2013-12-17 13:29:31

标签: java swing actionlistener text-editor key-bindings

问题 我正在使用Swing在java中创建一个文本编辑器。我有一个保存文件的按钮,使用这种方法:

private void save() {
        if (savedAs) {
            try {
                PrintWriter fout = new PrintWriter(savedAsFile);
                fout.print(textArea.getText());
                fout.close();
                this.setTitle("Text Editor - " + fileName);
                saved = true;
            } catch (FileNotFoundException ex) {
                Logger.getLogger(TextEditorFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

savedAs布尔值仅在首次创建文件时为true,否则只保存它而不打开另存为文件选择器。当我使用按钮时,一切正常,但是当我从密钥绑定中调用save()方法时,它会保存,但是由于这种方法:

private void textAreaKeyTyped(java.awt.event.KeyEvent evt) {                                  
    this.setTitle("Text Editor - *" + fileName);
    saved = false;
}         

它将星号重新添加到标题上。我希望它在没有星号的情况下显示它,因为它已被保存。如何在动作侦听器调用save方法时确保textAreaKeyTyped方法不接收输入。

键绑定actionlistener:

public void initBindings() {
    textArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(
            KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_DOWN_MASK), "actionMapKey");
    textArea.getActionMap().put("actionMapKey", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            save();
        }
    });
}

原因 我认为文本区域会选择用户输入CTRL + S引起的输入,因此将星号放在标题中。

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你有两个选择:

  1. 忽略textAreaKeyTyped方法中的(Ctrl + s)键evt。也许还会忽略不一定编辑文本的其他组合

  2. 或者在保存

  3. 后设置标题(不带星号)

答案 1 :(得分:0)

最强大的方法是保留String lastSaved对象。

执行save()时:

lastSaved = textArea.getText();

然后在textAreaKeyTyped()做:

boolean unchanged = textArea.getText.equals(lastSaved);

if (!unchanged) {
   // add *, enable save, etc
} else {
   // remove *, disable save, etc
}

这将带来额外的好处,如果用户撤消其更改,他们的文档将返回“未修改”状态。

我实际上会创建一个包含该代码的方法updateSaveState()并同时保存和修改回调调用updateSaveState(),删除那里的重复代码并将窗口标题等所有逻辑放在一个地方。

我也很想创建一个返回isModified()的{​​{1}}方法并完全删除已保存的标记。任何想知道的事情都可以致电!textArea.getText.equals(lastSaved)

请注意,在这种情况下,在收到keyTyped时将不会应用编辑。如果您执行isModified()延迟处理,直到处理完按键后应解决此问题。