【问题标题】:Java - checking multiple JTextFields with keytyped actionJava - 使用 keytyped 操作检查多个 JTextField
【发布时间】:2011-12-13 06:58:21
【问题描述】:

我有 3 个摆动文本字段和一个摆动按钮。当这三个字段都没有空白时,我想要做的是将 button.setEnabled() 从 false 更改为 true。我想这并不难,但我就是找不到办法。 在一个文本字段的键控操作上设置 button.setEnabled(true) 很容易,但我如何检查所有这些操作? 感谢您的回复。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    您不想只检查键盘输入,因为您还想考虑复制和粘贴输入删除(停用 JButton)。我会为所有三个字段的关联文档使用一个 DocumentListener,然后如果所有文档都包含文本,则将按钮设置为启用。

    例如,

    import java.awt.GridLayout;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*;
    
    public class FieldListenerTest {
       private static final int FIELD_COUNT = 5;
    
       private static void createAndShowUI() {
          JButton button = new JButton("Button");
          FieldListener fieldListener = new FieldListener(button);
          JPanel mainPanel = new JPanel(new GridLayout(0, 1));
          for (int i = 0; i < FIELD_COUNT; i++) {
             JTextField field = new JTextField(10);
             fieldListener.registerDoc(field.getDocument());
             mainPanel.add(field);
          }
          button.setEnabled(false);
          mainPanel.add(button);
    
          JFrame frame = new JFrame("FieldListenerTest");
          frame.getContentPane().add(mainPanel);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          java.awt.EventQueue.invokeLater(new Runnable() {
             public void run() {
                createAndShowUI();
             }
          });
       }
    }
    
    class FieldListener implements DocumentListener {
       private List<Document> docs = new ArrayList<Document>();
       private JButton button;
    
       public FieldListener(JButton button) {
          this.button = button;
       }
    
       public void registerDoc(Document doc) {
          docs.add(doc);
          doc.addDocumentListener(this);
       }
    
       @Override
       public void changedUpdate(DocumentEvent arg0) {
          update();
       }
    
       @Override
       public void insertUpdate(DocumentEvent arg0) {
          update();
       }
    
       @Override
       public void removeUpdate(DocumentEvent arg0) {
          update();
       }
    
       private void update() {
          for (Document doc : docs) {
             if (doc.getLength() == 0) {
                button.setEnabled(false);
                return;
             }
          }
          button.setEnabled(true);
       }
    
    }
    

    【讨论】:

    • 必须在 EDT 上完成,只有 Listener 可以这样做,文档 +1
    • 谢谢。不过需要减少耦合。
    【解决方案2】:

    我会这样做:

    创建一个匿名侦听器,检查字段是否为空白并相应地设置按钮状态(例如):

         DocumentListener listener = new DocumentListener() {
            public void changedUpdate(DocumentEvent e) { 
               updateButton();
            }
    
            public void insertUpdate(DocumentEvent e) {
               updateButton();
            } 
    
            private void updateButton() {
               boolean all_blank = tf1.getText().isEmpty() && 
                                   tf2.getText().isEmpty() &&
                                   tf3.getText().isEmpty();
               button.setEnabled(!all_blank);
            }
    
            public void removeUpdate(DocumentEvent e) {
               updateButton();
            }
         };
    

    然后将其附加到所有字段:

    tf1.getDocument().addDocumentListener(listener);
    tf2.getDocument().addDocumentListener(listener);
    tf3.getDocument().addDocumentListener(listener);
    

    注意:正如 Eng.Fouad 提到的,KeyListener 不会通过粘贴触发,因此我将其更改为 DocumentListener

    【讨论】:

      【解决方案3】:

      一种简单的方法:无论您将button.setEnabled(true) 放在哪里,都可以放置类似

      button.setEnabled(!tf1.getText().isEmpty() && !tf2.getText().isEmpty() && !tf3.getText().isEmpty());
      

      【讨论】:

      • 这对某个时间点来说很好,但您仍然想将它附加到某个听众,对吧?
      • 是的,致所有DocumentListeners,就像你所做的那样。抱歉,我的回答有点太简短了。
      猜你喜欢
      • 1970-01-01
      • 2023-01-20
      • 2019-04-02
      • 1970-01-01
      • 2018-01-20
      • 2013-06-12
      • 2011-04-16
      • 2017-07-16
      相关资源
      最近更新 更多