我有一个带有两个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?
问候
答案 0 :(得分:2)
您需要进行两项测试:
!textField.getText().trim().isEmpty()
和buttonGroup.getSelection() != null
结合起来,它可能看起来像:
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
课程,以执行以下操作:
isDataEntered()
方法。addButtonGroup(...)
方法。此方法将保存ButtonGroup
,然后遍历组中的所有单选按钮,将ItemListener
添加到单选按钮。isDataEntered()
方法以遍历每个ButtonGroup
并调用getSelection()
上的ButtonGroup
方法。如果值为null
,则表示未选择任何单选按钮,您只需返回false
。