我的英语非常糟糕,所以我在Google上找不到任何内容,我的JFrame
JPanel
包含了很多JTextField
。当我创建“保存文件”功能时,我必须为每个KeyListener
添加JTextField
。有没有更有效的方法呢?
编辑:测试自上次保存以来是否修改了任何字段
答案 0 :(得分:2)
关于,
编辑:测试自上次保存以来是否修改了任何字段
然后使用DocumentListener。通过这种方式,您可以监听除按键之外发生的更改,例如剪切和粘贴,并且仍然会响应相同的内容。
你问:
这看起来很酷,但有没有办法将它添加到JPanel或我需要将它添加到所有字段?
您需要将侦听器添加到每个字段的Document中,但如果将字段放在列表或数组中,则使用简单的for循环很容易。例如,运行以下代码。无论何时按下保存按钮,或按alt-s激活它,它都会被禁用。它可以通过对任何JTextField持有的文档的任何更改自动启用。
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class DocListenerEg extends JPanel {
private static final int FIELD_COUNT = 10;
private static final int COLUMNS = 8;
private JButton saveButton = new JButton(new SaveAction("Save", KeyEvent.VK_S));
private List<JTextField> fieldList = new ArrayList<>();
public DocListenerEg() {
MyDocListener docListener = new MyDocListener();
add(saveButton);
for (int i = 0; i < FIELD_COUNT; i++) {
JTextField field = new JTextField(COLUMNS);
add(field);
fieldList.add(field);
field.getDocument().addDocumentListener(docListener);
}
}
public void documentChange() {
saveButton.setEnabled(true);
}
private class MyDocListener implements DocumentListener {
private boolean changed = false;
@Override
public void changedUpdate(DocumentEvent dEvt) {
documentChange();
}
@Override
public void insertUpdate(DocumentEvent dEvt) {
documentChange();
}
@Override
public void removeUpdate(DocumentEvent dEvt) {
documentChange();
}
}
private class SaveAction extends AbstractAction {
public SaveAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent evt) {
// TODO: save the data
((AbstractButton) evt.getSource()).setEnabled(false);
}
}
private static void createAndShowGui() {
DocListenerEg mainPanel = new DocListenerEg();
JFrame frame = new JFrame("DocListenerEg");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}