如果JTextFields为空并且未选中RadioButtons,则禁用按钮

时间:2017-02-18 14:48:43

标签: java swing button listener

我有一个带有两个JTextField的JDialog,一个带有两个RadioButtons的ButtonGroup和一个OK-Button。必须禁用该按钮,直到填充TextField并且至少单击其中一个RadioButton。我不知道该怎么做。

它适用于使用此代码的JTextField:

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

但RadioButtons怎么样?我想我必须以某种方式实现ItemListener?

问候

3 个答案:

答案 0 :(得分:2)

您需要进行两项测试:

  1. JTextField是否包含非空白文本,经过类似测试,!textField.getText().trim().isEmpty()
  2. 是否选择了一个JRadioButton,可以通过buttonGroup.getSelection() != null
  3. 查看ButtonGroup是否包含非null ButtonModel来测试

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

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

    然后简单地在ActionListeners中调用上面的方法添加到JRadioButtons和你的JTextField的DocumentListener中。例如:

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

答案 1 :(得分:1)

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

例如:

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

答案 2 :(得分:1)

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

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

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

  

但RadioButtons怎么样?我想我必须以某种方式实现ItemListener?

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

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