问题 我正在使用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引起的输入,因此将星号放在标题中。
谢谢!
答案 0 :(得分:0)
我认为你有两个选择:
忽略textAreaKeyTyped方法中的(Ctrl + s)键evt。也许还会忽略不一定编辑文本的其他组合
或者在保存
答案 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()
延迟处理,直到处理完按键后应解决此问题。