2014-09-27 66 views
1

我的英語非常糟糕,所以我在Google上找不到任何東西,我有一個JFrameJPanel,其中包含很多JTextField。當我創建「保存文件」功能時,我必須爲每個JTextField添加一個KeyListener。有沒有更有效的方法呢?很多JTextField的一個關鍵聽衆

編輯:是測試的任何字段已自去年修改保存

+0

爲什麼您需要JTextField上的KeyListener來保存文件?我想你有一個觸發事件的按鈕,這就是你所需要的。 – Dici 2014-09-27 23:05:06

+0

您幾乎不應該將KeyListener添加到文本組件(如JTextField)。有可能有更好的方法來做到這一點,比如使用Key Bindings。事實上,這是一個潛在的解決方案。你想要捕捉什麼關鍵? – 2014-09-27 23:06:33

+0

'「編輯:測試自上次保存以來是否有任何字段被修改過。' - 在這種情況下,使用DocumentListener。 – 2014-09-27 23:07:47

回答

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(); 
     } 
     }); 
    } 
} 
+0

這看起來很酷,但有什麼方法將它添加到JPanel或我需要將它添加到所有字段? – Germi 2014-09-27 23:12:33

+0

@Germi:請參閱上面的修改。 – 2014-09-27 23:19:15