Java 保持jButton为灰色,直到jTextFields!=无效的

Java 保持jButton为灰色,直到jTextFields!=无效的,java,swing,documentlistener,Java,Swing,Documentlistener,我有4个jTextFields,一旦按下submit按钮,我就会将输入保存到文件中。我希望能够保持提交按钮禁用,直到每个字段至少不为空。我可以把这样的东西放在哪里 if(jTextField1 == null || jTextField2 == null || jTextField3 == null || jTextField4 == null){ jButton2.setEnabled(false); } 这样程序将启用/禁用按钮live。就像最后一个字段中有

我有4个jTextFields,一旦按下submit按钮,我就会将输入保存到文件中。我希望能够保持提交按钮禁用,直到每个字段至少不为空。我可以把这样的东西放在哪里

    if(jTextField1 == null || jTextField2 == null || jTextField3 == null || jTextField4 == null){
        jButton2.setEnabled(false);
    }

这样程序将启用/禁用按钮live。就像最后一个字段中有一个字符一样,我希望启用它?

您需要添加侦听器来检测用户何时输入文本。为了让它注册任何更改(而不仅仅是当用户点击
Enter
),您应该在每个
JTextField
的基础文档中附加一个
DocumentListener

然后,让每个侦听器调用一个函数来进行检查,并相应地更新
JButton
启用状态


jTextField可能为空,但不一定为空。你想测试它的内容

if(jTextField1.getText() == null || jTextField2.getText() == null || jTextField3.getText() == null || jTextField4.getText() == null){
    jButton2.setEnabled(false);
}

如果要更新按钮,需要检查“编辑”上的内容。您可以通过实现一个操作侦听器来监视文本字段的内容来实现这一点。您可以使用DocumentListener()实现这一点。

一个简单的可运行演示:


导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.util.List;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
导入javax.swing.event.DocumentEvent;
导入javax.swing.event.DocumentListener;
公共类ButtonDemo扩展JFrame实现DocumentListener{
/**
* 
*/
私有静态最终长serialVersionUID=-687049056595997315L;
专用JPanel面板=空;
私有JTextField field1=null;
私有JTextField field2=null;
私有JButton btn=null;
私有列表textFields=null;
公共静态void main(字符串[]args){
新按钮demo();
}
私有ButtonDemo(){
this.panel=new JPanel();
this.field1=新的JTextField(“JTextField_1”);
this.field2=新的JTextField(“JTextField_2”);
this.field1.getDocument().addDocumentListener(this);
this.field2.getDocument().addDocumentListener(this);
this.textFields=新向量();
this.textFields.add(field1);
this.textFields.add(field2);
this.btn=新JButton(“测试按钮”);
this.panel.setLayout(新的FlowLayout());
本.panel.add(字段1);
本.panel.add(字段2);
此.panel.add(btn);
本条添加(面板);
此.setPreferredSize(新维度(200200));
这个包();
此.setVisible(true);
}
@凌驾
公共作废插入更新(文档事件e){
updateButtonEnabledStatus(btn,文本字段);
}
@凌驾
公共作废移除更新(文档事件e){
updateButtonEnabledStatus(btn,文本字段);
}
@凌驾
公共作废更改日期(记录事件e){
updateButtonEnabledStatus(btn,文本字段);
}
私有void updateButtonEnabledStatus(JButton btn,列表字段){
布尔启用=真;
for(JTextField字段:字段){
if(field.getText().length()==0){
启用=错误;
打破
}
}
btn.setEnabled(已启用);
}
}

无论文本字段的文本在哪里更改,都可以使用每个文本字段的按键监听器来运行检查

禁用按钮的方法为setEnabled(假)

请注意,如果此时您的文本域为空(侦听器将不运行),则在程序启动时,您必须使按钮处于禁用状态

  • 在初始化组件时禁用该按钮
  • 例如:

    2) 通过调用最后一个jTextField中的事件“KeyReleased”来启用它

    例如:

    如果这样做,当任何字符进入最后一个文本字段时,该按钮将自动启用


    谢谢:)

    这张支票怎么办?是否希望在每个文档侦听器中设置一个变量,然后当它们调用该方法时(例如,如果全部为true),则按钮将设置启用?@erp您只需要测试每个字段是否为非空。类似于
    if(jTextField1.getText().equals(“”| |…)jButton2.setEnabled(false)否,您不想检查null,因为在这种情况下JTextFields不应该为null。相反,请确保实例化所有JTextFields,并根据resueman的正确答案检查它们的文档。例如,请查看我的答案。对不起,这是一个非常糟糕的答案。永远不要在JTextField中使用KeyListener,尤其不要用于此目的。相反,根据这个问题的其他答案,使用DocumentListener检查JTextField的文档。很抱歉,这是一个糟糕的建议:1)需要使用KeyListener,这可能会干扰文本字段的内部工作;2)对于复制和粘贴应用程序,它根本不起作用。本问答中已经列出了许多更好、更强大的解决方案。决不要在Swing文本组件上使用键侦听器,而应始终使用更高级别的侦听器,如DocumentListeners或DocumentFilters。
    
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.util.List;
    import java.util.Vector;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    
    public class ButtonDemo extends JFrame implements DocumentListener {
    
        /**
         * 
         */
        private static final long serialVersionUID = -68704905659973315L;
    
        private JPanel panel = null;
        private JTextField field1 = null;
        private JTextField field2 = null;
        private JButton btn = null;
        private List<JTextField> textFields = null;
    
        public static void main(String[] args) {
            new ButtonDemo();
        }
    
        private ButtonDemo() {
            this.panel = new JPanel();
            this.field1 = new JTextField("JTextField_1");
            this.field2 = new JTextField("JTextField_2");
    
            this.field1.getDocument().addDocumentListener(this);
            this.field2.getDocument().addDocumentListener(this);
    
            this.textFields = new Vector<>();
            this.textFields.add(field1);
            this.textFields.add(field2);
            this.btn = new JButton("Tests-Button");
    
            this.panel.setLayout(new FlowLayout());
            this.panel.add(field1);
            this.panel.add(field2);
            this.panel.add(btn);
    
            this.add(panel);
    
            this.setPreferredSize(new Dimension(200, 200));
            this.pack();
            this.setVisible(true);
        }
    
        @Override
        public void insertUpdate(DocumentEvent e) {
            updateButtonEnabledStatus(btn, textFields);
        }
    
        @Override
        public void removeUpdate(DocumentEvent e) {
            updateButtonEnabledStatus(btn, textFields);
        }
    
        @Override
        public void changedUpdate(DocumentEvent e) {
            updateButtonEnabledStatus(btn, textFields);
        }
    
        private void updateButtonEnabledStatus(JButton btn, List<JTextField> fields) {
            boolean enabled = true;
            for (JTextField field : fields) {
                if (field.getText().length() == 0) {
                    enabled = false;
                    break;
                }
            }
            btn.setEnabled(enabled);
        }
    }
    
     public Home() {
       
     initComponents();
     button.setEnabled(false);
    }
    
    private void jTextFieldKeyReleased(java.awt.event.KeyEvent evt) {
    button.setEnabled(true);
    }