2017-02-18 22 views
1

У меня есть JDialog с двумя JTextFields, одна ButtonGroup с двумя RadioButtons и кнопка OK. Кнопка должна быть отключена до тех пор, пока не будут заполнены текстовые поля и не будет нажата хотя бы одна из кнопок RadioButtons. Я не уверен, как это сделать.Отключить кнопку, если JTextFields пуст и RadioButtons не отмечены

Он работает с 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(); 
     } 
    }); 
    } 
} 

Но что о Radiobuttons? Думаю, мне нужно каким-то образом реализовать ItemListener?

Приветствия

ответ

1

Вы можете использовать isSelected(), чтобы проверить, является ли выбрана кнопка радио.

Например:

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

2

Вам нужно два теста:

  1. ли JTextField содержать непробельный текст, проверенную как так, !textField.getText().trim().isEmpty() и
  2. ли один JRadioButton выбран, который может быть проверен, если у ButtonGroup есть ненулевой выбор ButtonModel через buttonGroup.getSelection() != null

Комбинированные, это может выглядеть примерно так:

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

Тогда просто вызовите метод выше в ActionListeners добавленного к JRadioButton, и DocumentListener вашего JTextField в. Например:

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

проверить: 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.

 Смежные вопросы

  • Нет связанных вопросов^_^