2017-02-18 31 views
1

我有一個JDialog有兩個JTextFields,一個ButtonGroup有兩個RadioButtons和一個OK按鈕。按鈕必須被禁用,直到TextFields被填充並且至少有一個RadioButton被點擊。我不知道如何做到這一點。禁用按鈕,如果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(); 
     } 
    }); 
    } 
} 

但對於單選按鈕?我想我必須以某種方式實現ItemListener?

問候

回答

1

您可以使用​​檢查單選按鈕是否被選中。

如:

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

然後,只需調用添加到JradioButton將和您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()); 
    } 
} 
1

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

它提供了啓用按鈕時,所有的文本字段中輸入數據的通用解決方案。

您可以增強該解決方案以支持單選按鈕。

但是RadioButtons呢?我想我必須以某種方式實現ItemListener?

您可以修改上面的鏈接找到了DataEntered類執行以下操作:

  1. 實現一個ItemListener簡單地調用isDataEntered()方法。
  2. 創建一個新的addButtonGroup(...)方法。此方法將保存ButtonGroup,然後遍歷組中的所有單選按鈕以將ItemListener添加到單選按鈕。
  3. 那麼您需要修改isDataEntered()方法以迭代ButtonGroup並在ButtonGroup上調用getSelection()方法。如果值爲null這意味着沒有選擇單選按鈕,並且您只返回false
相關問題