Java - 使用按键操作检查多个 JTextField

发布于 2024-12-11 03:54:23 字数 177 浏览 0 评论 0原文

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

I have 3 swing text fields and a swing button. What i want to do is to change button.setEnabled() from false to true when there is none of those 3 fields blank. I suppose it's not really difficult, but i just can't find a way to do it.
It's easy to have button.setEnabled(true) on keytyped action of one text field, but how do i check all of them?
Thanks for your replies.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

素手挽清风 2024-12-18 03:54:23

您不想只检查键盘输入,因为您还想考虑复制和粘贴输入删除(停用 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);
   }

}

You don't want to check for just keyboard input as you want to also account for copy and paste input and removal (deactivate the JButton). I'd use one DocumentListener for all three of the field's associated Documents and then set the button to enabled if all documents contain text.

For example,

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);
   }

}
绝情姑娘 2024-12-18 03:54:23

这就是我要做的:

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

     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

This is how I would do it:

Create a single anonymous listener that checks if fields are blank and sets the button state accordingly (eg):

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

And then attach it to all of the fields:

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

Note: As Eng.Fouad mentioned, KeyListener does not fire with paste, so I've changed it to a DocumentListener

眼藏柔 2024-12-18 03:54:23

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

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

One simple way: wherever you would put button.setEnabled(true) put something like

button.setEnabled(!tf1.getText().isEmpty() && !tf2.getText().isEmpty() && !tf3.getText().isEmpty());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文