保持 jButton 灰色直到 jTextFields != null

Posted

技术标签:

【中文标题】保持 jButton 灰色直到 jTextFields != null【英文标题】:keep jButton grey until jTextFields != null 【发布时间】:2014-10-12 19:45:21 【问题描述】:

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

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

以便程序实时启用/禁用按钮。就像一旦最后一个字段中有 1 个字符,我希望它被启用?

【问题讨论】:

不,您不想检查 null,因为在这种情况下 JTextFields 不应为 null。相反,请确保您实例化所有 JTextFields 并按照 resueman 的正确答案检查它们的文档。 例如请看我的回答here。 【参考方案1】:

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

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

Related

【讨论】:

支票会做什么?会像在每个文档侦听器中设置一个变量,然后当他们调用该方法时,如果所有内容都为真,那么按钮将 setEnable? @erp 您只需要测试每个字段是否为非空。类似if(jTextField1.getText().equals("") || ...) jButton2.setEnabled(false);【参考方案2】:

一个简单的可运行演示:


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

【讨论】:

【参考方案3】:

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

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

如果您想更新按钮,您需要在编辑时检查内容。您可以通过实现一个动作监听器来观察文本字段的内容来做到这一点。您可以使用 DocumentListener (http://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html) 来做到这一点。

【讨论】:

【参考方案4】:

使用每个文本字段的 keyPressed 侦听器在文本字段的文本发生更改的地方运行检查。

禁用按钮的方法是setEnabled(false);

请注意,如果您的 textfiends 是空的,那么您必须在程序启动时禁用按钮(侦听器不会运行)

【讨论】:

抱歉,这是一个非常糟糕的答案。您永远不应该在 JTextField 中使用 KeyListener,尤其是不要用于此目的。而是根据此问题的其他答案使用 DocumentListener 检查 JTextField 的文档。【参考方案5】:
    在初始化组件时禁用按钮

例如:

 public Home() 
   
 initComponents();
 button.setEnabled(false);

2) 通过在最后一个 jTextField 中调用事件 'KeyReleased' 来启用它。

例如:

private void jTextFieldKeyReleased(java.awt.event.KeyEvent evt) 
button.setEnabled(true);

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

谢谢你:)

【讨论】:

抱歉直言不讳,但这是一个糟糕的建议:1) 需要使用 KeyListener,这可能会干扰文本字段的内部工作,以及 2) 它根本不起作用用于复制和粘贴应用程序。这个问题和答案中已经列出了更好和更强大的解决方案。永远不要在 Swing 文本组件上使用关键侦听器,而始终支持更高级别的侦听器,例如 DocumentListeners 或 DocumentFilters。

以上是关于保持 jButton 灰色直到 jTextFields != null的主要内容,如果未能解决你的问题,请参考以下文章

JButton 的图标(顶部)和文本(底部)都向左对齐

NSTableView - 初始选择灰色,直到点击(焦点)

用内容重新加载我的 tableView 后,它仍然显示为灰色,直到我点击它..为啥?

CSS/HTML:点击时删除图像过滤器

Chart.js 圆环图保持灰色 - 没有颜色

仅当 Validation 为 True 时才启用 Jbutton