2014-09-27 65 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