2012-02-17 89 views
2

我正在爲由四個JPanel組成的JFrame實現一個清除按鈕。每個JPanel都有幾個文本字段,單選按鈕和複選框。實現一個JFrame的清除按鈕

當窗體加載「清除」按鈕應該被禁用。只有在用戶爲任何面板中的任何字段輸入了某個值時才應啓用它。

我試着通過添加一個KeyListener到面板。但它沒有正確地得到事件。我是否必須爲所有UI組件註冊KeyListener?任何其他好方法?

在此先感謝!

回答

5

進行更改,您可以添加ItemListenerJCheckBoxJRadioButtonsJTextField您可以添加CaretListener

這個小程序可以幫助你:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.CaretListener; 
import javax.swing.event.CaretEvent; 

public class StateChangedEventClass extends JFrame 
{ 
    private JPanel contentPane, panel1, panel2; 
    private JButton clearButton; 
    private ItemListener itemChangeAction; 
    private CaretListener caretAction; 

    public StateChangedEventClass() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     contentPane = new JPanel(); 
     contentPane.setLayout(new GridLayout(2, 2)); 
     clearButton = new JButton("CLEAR"); 
     clearButton.setEnabled(false); 

     itemChangeAction = new ItemListener() 
     { 
      public void itemStateChanged(ItemEvent ce) 
      { 
       clearButton.setEnabled(true); 
      } 
     }; 

     caretAction = new CaretListener() 
     { 
      public void caretUpdate(CaretEvent ce) 
      { 
       clearButton.setEnabled(true); 
      } 
     }; 

     panel1 = new JPanel(); 
     panel1.setLayout(new GridLayout(2 , 2)); 
     JLabel userLabel = new JLabel("USERNAME : ", JLabel.CENTER); 
     JTextField userField = new JTextField(10); 
     userField.addCaretListener(caretAction); 
     JLabel passLabel = new JLabel("PASSWORD : " + JLabel.CENTER); 
     JTextField passField = new JTextField(10); 
     passField.addCaretListener(caretAction); 
     panel1.add(userLabel); 
     panel1.add(userField); 
     panel1.add(passLabel); 
     panel1.add(passField); 
     contentPane.add(panel1); 

     panel2 = new JPanel(); 
     panel2.setLayout(new GridLayout(2, 1)); 
     JRadioButton maleButton = new JRadioButton("MALE", false); 
     maleButton.addItemListener(itemChangeAction); 
     JRadioButton femaleButton = new JRadioButton("FEMALE", false); 
     femaleButton.addItemListener(itemChangeAction); 
     ButtonGroup bg = new ButtonGroup(); 
     bg.add(maleButton); 
     bg.add(femaleButton); 
     panel2.add(maleButton); 
     panel2.add(femaleButton); 
     contentPane.add(panel2); 

     add(contentPane, BorderLayout.CENTER); 
     add(clearButton, BorderLayout.PAGE_END); 

     pack(); 
     setVisible(true); 
    } 

    public void caretUpdate(CaretEvent ce) 
    { 
     clearButton.setEnabled(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new StateChangedEventClass(); 
      } 
     }); 
    } 
} 
+0

謝謝!有用。 – pavithraCS 2012-02-17 09:38:05

+0

@pavithraCS:你的歡迎和保持微笑:-) – 2012-02-17 09:41:24

1

您必須添加的ActionListeners你JTextField的情況,在文本字段此檢查文本值之後,例如:

jButton.setEnabled(!jTextField.getText().equals("")); 
+0

謝謝你的answer.But有形式很多文本框。我想找到一個簡單的解決方案。您可以定義布爾標誌,例如: – pavithraCS 2012-02-17 08:21:07

+0

boolean flag =!jTextField1.getText()。equals ... || !jTextFieldN.getText()等於( 「」); jButton.setEnabled(flag); – alnasfire 2012-02-17 08:26:19

4

KeyListener沒有被指定爲Listening在Swing GUI一個Keyboards事件,Swing是有KeyBindings

+0

+1 KeyBinding over KeyListener :-) – 2012-02-17 09:05:06

+0

但是不確定,看起來在這種情況下的KeyListeners會更合適,因爲將鍵盤上的所有26個鍵和鍵盤上的數字綁定到10個鍵將不是一個好主意,檢查用戶在JTextField上按下了哪個鍵。希望我沒有錯:-) – 2012-02-17 09:12:07

+0

Swing Gurus的某人在這裏計算好'KeyListener'和'KeyBinding'需要的字符數,通過在代碼中計算字符並沒有直徑差異,只返回到'KeyBindings'從'KeyBinding's Action調用'JButton#doClick()'[JButton#doClick()](http://docs.oracle.com/javase/6/docs/api/javax/swing/AbstractButton.html#doClick% 28%29) – mKorbel 2012-02-17 09:19:06

1

只有當用戶在任何面板的這些字段中輸入任何值時,才應該啓用它。

因此,您應該爲所有這些字段實施KeyListener接口。一旦檢測到用戶的打字動作,你應該啓用按鈕。

jButton.setEnabled(true); 

我必須註冊的KeyListener所有UI組件?

當然沒有。編寫一個擴展JTextField並實現KeyListener的類。從這個類派生你的對象(所有文本字段)。如果你在擊鍵時實施你應該做的事情,所有這些對象都會遵守你的規則。