我的英語非常糟糕,所以我在Google上找不到任何東西,我有一個JFrame
與JPanel
,其中包含很多JTextField
。當我創建「保存文件」功能時,我必須爲每個JTextField
添加一個KeyListener
。有沒有更有效的方法呢?很多JTextField的一個關鍵聽衆
編輯:是測試的任何字段已自去年修改保存
我的英語非常糟糕,所以我在Google上找不到任何東西,我有一個JFrame
與JPanel
,其中包含很多JTextField
。當我創建「保存文件」功能時,我必須爲每個JTextField
添加一個KeyListener
。有沒有更有效的方法呢?很多JTextField的一個關鍵聽衆
編輯:是測試的任何字段已自去年修改保存
關於,
編輯:是測試的任何字段已自去年修改保存
然後使用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();
}
});
}
}
這看起來很酷,但有什麼方法將它添加到JPanel或我需要將它添加到所有字段? – Germi 2014-09-27 23:12:33
@Germi:請參閱上面的修改。 – 2014-09-27 23:19:15
爲什麼您需要JTextField上的KeyListener來保存文件?我想你有一個觸發事件的按鈕,這就是你所需要的。 – Dici 2014-09-27 23:05:06
您幾乎不應該將KeyListener添加到文本組件(如JTextField)。有可能有更好的方法來做到這一點,比如使用Key Bindings。事實上,這是一個潛在的解決方案。你想要捕捉什麼關鍵? – 2014-09-27 23:06:33
'「編輯:測試自上次保存以來是否有任何字段被修改過。' - 在這種情況下,使用DocumentListener。 – 2014-09-27 23:07:47