有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果JTextFields为空且未选中单选按钮,则java禁用按钮

我有一个JDialog和两个JTextFields,一个ButtonGroup和两个单选按钮,还有一个OK按钮。必须禁用该按钮,直到填充文本字段并单击至少一个单选按钮。我不知道该怎么做

它适用于使用以下代码的JTextFields:

public class Test {
  public static void main(String... args) {
    ButtonTest.show();
  }

}

class ButtonTest {

  private ButtonTest() {
    JFrame frame = new JFrame("Button Test");
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    frame.setLocationByPlatform(true);

    JPanel mainPanel = new JPanel(new GridLayout(4, 1));

    JTextField field1 = new JTextField(20);
    JTextField field2 = new JTextField(20);
    JLabel text = new JLabel();
    JButton printButton = new JButton("Print");
    printButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        text.setText(field1.getText() + " - " + field2.getText());
      }
    });
    printButton.setEnabled(!field1.getText().isEmpty() && !field2.getText().isEmpty());
    for (JComponent c : Arrays.asList(field1, field2, text, printButton)) {
      mainPanel.add(c);
    }

    setDocumentListener(field1, field2, printButton);
    setDocumentListener(field2, field1, printButton);

    frame.add(mainPanel);
    frame.pack();
    frame.setVisible(true);
  }

  private void setDocumentListener(JTextField field, JTextField other, JButton button) {
    field.getDocument().addDocumentListener(new DocumentListener() {
      @Override
      public void removeUpdate(DocumentEvent e) {
        changed();
      }

      @Override
      public void insertUpdate(DocumentEvent e) {
        changed();
      }

      @Override
      public void changedUpdate(DocumentEvent e) {
        changed();
      }

      private void changed() {
        setButtonStatus(button, field.getText(), other.getText());
      }
    });
  }

  private void setButtonStatus(JButton button, String field1, String field2) {
    button.setEnabled(!field1.isEmpty() && !field2.isEmpty());
  }

  public static void show() {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new ButtonTest();
      }
    });
  }
}

但是单选按钮呢?我想我必须以某种方式实现一个ItemListener

问候


共 (3) 个答案

  1. # 1 楼答案

    您可以使用isSelected()检查单选按钮是否被选中

    例如:

    printButton.setEnabled(!field1.getText().isEmpty() && !field2.getText().isEmpty() && (radioBtn1.isSelected() || radioBtn2.isSelected()) );

  2. # 2 楼答案

    退房:Validation of text fields and contact no text field

    它为在所有文本字段中输入数据时启用按钮提供了通用解决方案

    您可以增强该解决方案以支持单选按钮

    But what about the RadioButtons? I guess I have to somehow implement an ItemListener?

    您可以修改上面链接中的DataEntered类,以执行以下操作:

    1. 实现一个ItemListener来简单地调用isDataEntered()方法
    2. 创建一个新的addButtonGroup(...)方法。此方法将保存ButtonGroup,然后遍历组中的所有单选按钮,将ItemListener添加到单选按钮
    3. 然后,您需要修改isDataEntered()方法来迭代每个ButtonGroup,并在ButtonGroup上调用getSelection()方法。如果值为null,则表示没有选择单选按钮,您只需返回false
  3. # 3 楼答案

    你需要两个测试:

    1. JTextField是否包含非空白文本,测试结果如下:!textField.getText().trim().isEmpty(),以及
    2. 是否选择了一个JRadioButton,可以通过buttonGroup.getSelection() != null查看ButtonGroup是否包含非空的ButtonModel选择来测试它

    结合起来,它可能看起来像:

    private void testToActivateButton() {
        boolean value = !textField.getText().trim().isEmpty() && buttonGroup.getSelection() != null;
        submitButton.setEnabled(value);
    }
    

    然后在添加到JRadioButtons和JTextField的DocumentListener中的ActionListeners中调用上述方法。例如:

    import javax.swing.*;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    
    public class ActivateButton extends JPanel {
        private static final String[] RADIO_TEXTS = {"Hello", "Goodbye"};
        private ButtonGroup buttonGroup = new ButtonGroup();
        private JTextField textField = new JTextField(10);
        private JButton submitButton = new JButton("Submit");
    
        public ActivateButton() {
            textField.getDocument().addDocumentListener(new DocumentListener() {
    
                @Override
                public void removeUpdate(DocumentEvent e) {
                    testToActivateButton();
                }
    
                @Override
                public void insertUpdate(DocumentEvent e) {
                    testToActivateButton();
                }
    
                @Override
                public void changedUpdate(DocumentEvent e) {
                    testToActivateButton();
                }
            });
    
            for (String radioText : RADIO_TEXTS) {
                JRadioButton radioButton = new JRadioButton(radioText);
                radioButton.addActionListener(e -> testToActivateButton());
                buttonGroup.add(radioButton);
                add(radioButton);
            }
    
            submitButton.setEnabled(false);
    
            add(textField);
            add(submitButton);
    
        }
    
        private void testToActivateButton() {
            boolean value = !textField.getText().trim().isEmpty() && buttonGroup.getSelection() != null;
            submitButton.setEnabled(value);
        }
    
        private static void createAndShowGui() {
            ActivateButton mainPanel = new ActivateButton();
    
            JFrame frame = new JFrame("ActivateButton");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    }