问题我正在使用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
布尔只有当第一次创建的文件真实,否则它只是保存它不保存为文件选择打开。当我使用按钮时,一切正常,但是,当我save()
从按键绑定中调用方法时,由于以下方法,它可以保存:
private void textAreaKeyTyped(java.awt.event.KeyEvent evt) {
this.setTitle("Text Editor - *" + fileName);
saved = false;
}
它将星号重新添加到标题上。我希望它显示时不带星号,因为它已保存。当动作监听器调用save方法时,如何确保textAreaKeyTyped方法不会拾取输入。
按键绑定动作侦听器:
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引起的输入,因此将星号放在标题中。
谢谢!
最可靠的方法是保留一个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()
返回!textArea.getText.equals(lastSaved)
并完全删除已保存标志的方法。任何想知道的都可以打电话isModified()
。
请注意,在这种情况下,在收到keyTyped时将不会应用编辑。如果您执行aSwingUtilities.invokeLater
来将您的处理延迟到处理完按键之后,则应该可以解决此问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句