如果JTextField的文档为空,如何指定JButton状态[重复]

Posted

技术标签:

【中文标题】如果JTextField的文档为空,如何指定JButton状态[重复]【英文标题】:How to specify JButton state if JTextField's document is empty [duplicate] 【发布时间】:2016-07-14 00:01:58 【问题描述】:

所以我今天才开始阅读有关DocumentListeners 和其他一些动作侦听器的信息,但是当任何文本字段为空时,我无法让我的JButton 恢复到setEnabled(false) 状态。这是否与插入符号位置有关,或者当任何文本字段为空时,是否有适当的方法将其恢复为原始状态 setEnabled(false)

这是我到目前为止所写的。

public class home extends javax.swing.JPanel 
    public home() 
        JPasswordField currentPasswordJPasswordField;
        JPasswordField newPasswordJPasswordField;
        JPasswordField reTypeNewPasswordJPasswordField;

        currentPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton));
        newPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton));
        reTypeNewPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton));
    

    public static class textFieldListener implements DocumentListener 
        JButton btn;

        public textFieldListener(JButton button) 
            btn = button;
        

        @Override
        public void insertUpdate(DocumentEvent e) 
            btn.setEnabled(true);
        

        @Override
        public void removeUpdate(DocumentEvent e) 
            btn.setEnabled(true);
        

        @Override
        public void changedUpdate(DocumentEvent e) 
            btn.setEnabled(true);
        
    

当我在文本字段中输入内容时,它会按预期启用保存按钮。 但是当我按退格键清除所有文本时,保存按钮不会恢复为 setEnabled(false)

我将不胜感激。我刚开始学习这个。我还想知道是否可以将动作侦听器放在单独的 .java 文件中。如果是这样,我如何将侦听器应用于我的主类。

谢谢。

【问题讨论】:

如需尽快获得更好的帮助,请发帖minimal reproducible example 或Short, Self Contained, Correct Example。 @AndrewThompson 我会注意这一点。我尽可能简洁地编辑了我的帖子。我想这是最短和最简洁的。谢谢。 您可能会注意到 MCVE 比“Minimal”更多,SSCCE 比“Short”更多。这是我建议您发布代码以满足的其他部分。发布代码,我们可以编译、运行并查看问题。 【参考方案1】:

您可以为每个文本字段添加一个 KeyListener,并从匿名内部类中更新按钮。

currentPasswordJPasswordField.addKeyListener(new KeyAdapter() 
    public void keyReleased(KeyEvent e) 
        super.keyReleased(e);
        if(currentPasswordJPasswordField.getText().length() > 0 && 
                newPasswordJPasswordField.getText().length() > 0 && 
                reTypeNewPasswordJPasswordField.getText().length() > 0) 
            btn.setEnabeld(true);
         else 
            btn.setEnabled(false);
        
    
);

newPasswordJPasswordField.addKeyListener(new KeyAdapter() 
    public void keyReleased(KeyEvent e) 
        super.keyReleased(e);
        if(currentPasswordJPasswordField.getText().length() > 0 && 
                newPasswordJPasswordField.getText().length() > 0 && 
                reTypeNewPasswordJPasswordField.getText().length() > 0) 
            btn.setEnabeld(true);
         else 
            btn.setEnabled(false);
        
    
);

reTypeNewPasswordJPasswordField.addKeyListener(new KeyAdapter() 
    public void keyReleased(KeyEvent e) 
        super.keyReleased(e);
        if(currentPasswordJPasswordField.getText().length() > 0 && 
                newPasswordJPasswordField.getText().length() > 0 && 
                reTypeNewPasswordJPasswordField.getText().length() > 0) 
            btn.setEnabeld(true);
         else 
            btn.setEnabled(false);
        
    
);

【讨论】:

我要去试试。我不知道有一个关键的听众。我现在也在阅读docs.oracle.com/javase/tutorial/uiswing/events/api.html 的文档。如果可行,我会添加评论。我很感激。谢谢。 是的,这就是要走的路。 如果我将文本粘贴到字段中或以编程方式更新字段会发生什么? KeyListener 无法处理这些用例【参考方案2】:

您的基本方法是正确的,使用DocumentListener,但您似乎没有在任何时候检查Document 内容的长度

这是一个非常简单的示例,但是在所有三个字段都包含内容之前,该按钮将不会被启用。

你可以通过检查前两个字段是否匹配来扩展这个想法,但我会留给你

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;

public class Test 

    public static void main(String[] args) 
        new Test();
    

    public Test() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
                    ex.printStackTrace();
                

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            
        );
    

    public class TestPane extends JPanel 

        private JPasswordField currentPasswordJPasswordField;
        private JPasswordField newPasswordJPasswordField;
        private JPasswordField reTypeNewPasswordJPasswordField;     

        private List<JTextComponent> requiredFields = new ArrayList<>(25);

        private JButton okay;

        public TestPane() 
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(2, 2, 2, 2);
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            currentPasswordJPasswordField = makePasswordField();
            newPasswordJPasswordField = makePasswordField();
            reTypeNewPasswordJPasswordField = makePasswordField();

            add(currentPasswordJPasswordField, gbc);
            add(newPasswordJPasswordField, gbc);
            add(reTypeNewPasswordJPasswordField, gbc);

            okay = new JButton("Ok");
            add(okay);

            updateState();
        

        protected JPasswordField makePasswordField() 
            JPasswordField field = new JPasswordField(20);
            field.getDocument().addDocumentListener(new DocumentHandler());
            requiredFields.add(field);
            return field;
        

        protected void updateState() 
            boolean enabled = true;
            for (JTextComponent field : requiredFields) 
                if (field.getDocument().getLength() == 0) 
                    enabled = false;
                    break;
                
            
            okay.setEnabled(enabled);
        

        public class DocumentHandler implements DocumentListener 

            @Override
            public void insertUpdate(DocumentEvent e) 
                updateState();
            

            @Override
            public void removeUpdate(DocumentEvent e) 
                updateState();
            

            @Override
            public void changedUpdate(DocumentEvent e) 
                updateState();
            

        

    


【讨论】:

以上是关于如果JTextField的文档为空,如何指定JButton状态[重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过 JTextField 循环到 getText 并检查是不是为空

使用 DocumentListener 实现检查 JTextField

JAVA中如何判断JTextField的一些问题?求高手解答……谢谢

如何从 JTextField 中检索文本?

java中JTextField输入的字符如何进行判断非法输入

如何在 Java Swing 中控制 JTextField 的宽度?