我正在爲由四個JPanel組成的JFrame實現一個清除按鈕。每個JPanel都有幾個文本字段,單選按鈕和複選框。實現一個JFrame的清除按鈕
當窗體加載「清除」按鈕應該被禁用。只有在用戶爲任何面板中的任何字段輸入了某個值時才應啓用它。
我試着通過添加一個KeyListener到面板。但它沒有正確地得到事件。我是否必須爲所有UI組件註冊KeyListener?任何其他好方法?
在此先感謝!
我正在爲由四個JPanel組成的JFrame實現一個清除按鈕。每個JPanel都有幾個文本字段,單選按鈕和複選框。實現一個JFrame的清除按鈕
當窗體加載「清除」按鈕應該被禁用。只有在用戶爲任何面板中的任何字段輸入了某個值時才應啓用它。
我試着通過添加一個KeyListener到面板。但它沒有正確地得到事件。我是否必須爲所有UI組件註冊KeyListener?任何其他好方法?
在此先感謝!
進行更改,您可以添加ItemListener
您JCheckBox
和JRadioButtons
和JTextField
您可以添加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();
}
});
}
}
您必須添加的ActionListeners你JTextField的情況,在文本字段此檢查文本值之後,例如:
jButton.setEnabled(!jTextField.getText().equals(""));
謝謝你的answer.But有形式很多文本框。我想找到一個簡單的解決方案。您可以定義布爾標誌,例如: – pavithraCS 2012-02-17 08:21:07
boolean flag =!jTextField1.getText()。equals ... || !jTextFieldN.getText()等於( 「」); jButton.setEnabled(flag); – alnasfire 2012-02-17 08:26:19
KeyListener沒有被指定爲Listening在Swing GUI一個Keyboards
事件,Swing是有KeyBindings
+1 KeyBinding over KeyListener :-) – 2012-02-17 09:05:06
但是不確定,看起來在這種情況下的KeyListeners會更合適,因爲將鍵盤上的所有26個鍵和鍵盤上的數字綁定到10個鍵將不是一個好主意,檢查用戶在JTextField上按下了哪個鍵。希望我沒有錯:-) – 2012-02-17 09:12:07
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
只有當用戶在任何面板的這些字段中輸入任何值時,才應該啓用它。
因此,您應該爲所有這些字段實施KeyListener
接口。一旦檢測到用戶的打字動作,你應該啓用按鈕。
jButton.setEnabled(true);
我必須註冊的KeyListener所有UI組件?
當然沒有。編寫一個擴展JTextField並實現KeyListener的類。從這個類派生你的對象(所有文本字段)。如果你在擊鍵時實施你應該做的事情,所有這些對象都會遵守你的規則。
謝謝!有用。 – pavithraCS 2012-02-17 09:38:05
@pavithraCS:你的歡迎和保持微笑:-) – 2012-02-17 09:41:24