Java 为JFrame实现清除按钮
我正在为包含四个JPanel的JFrame实现一个clear按钮。每个JPanel都有几个文本字段、单选按钮和复选框 当窗体加载时,应禁用“清除”按钮。仅当用户在任何面板中的任何字段中输入某些值时,才应启用该选项 我尝试向面板添加一个KeyListener。但它没有正确地获取事件。我必须为所有UI组件注册KeyListener吗?还有别的好方法吗Java 为JFrame实现清除按钮,java,swing,event-handling,Java,Swing,Event Handling,我正在为包含四个JPanel的JFrame实现一个clear按钮。每个JPanel都有几个文本字段、单选按钮和复选框 当窗体加载时,应禁用“清除”按钮。仅当用户在任何面板中的任何字段中输入某些值时,才应启用该选项 我尝试向面板添加一个KeyListener。但它没有正确地获取事件。我必须为所有UI组件注册KeyListener吗?还有别的好方法吗 提前谢谢 您必须将ActionListeners添加到JTextFields中,然后检查文本字段中的文本值,例如: jButton.setEnable
提前谢谢 您必须将ActionListeners添加到JTextFields中,然后检查文本字段中的文本值,例如:
jButton.setEnabled(!jTextField.getText().equals(""));
不是为Swing GUI中的键盘事件指定的,因为Swing在那里
仅当用户向其中任何一项输入某些值时,才应启用该选项
任何面板中的这些字段
因此,您应该为所有这些字段实现keylister
接口。在检测到用户的键入操作后,应启用该按钮
jButton.setEnabled(true);
我必须为所有UI组件注册KeyListener吗
当然不是。编写一个扩展JTextField并实现KeyListener的类。从此类派生对象(所有文本字段)。如果您实现了在按键时应该执行的操作,那么所有这些对象都将遵守您的规则。要进行更改,您可以将itemstener
添加到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();
}
});
}
}
谢谢你的回答。但是表单中有很多文本字段。我想找到一个简单的解决方案。你可以定义布尔标志,例如:布尔标志=!jTextField1.getText()等于(“”| | |…| |!jTextFieldN.getText()等于(“”);jButton.setEnabled(标志);但不确定,在这种情况下,似乎键盘监听器更合适,因为在键盘上绑定所有26个字母键和10个数字键来检查用户在JTextField上按下的键不是一个好主意。希望我没有错:-)这里的Swing大师有人在计算好的KeyListener
和KeyBinding
s所需的字符数,通过计算代码中的字符数没有直径上的差异,回到KeyBindings
只调用JButton#doClick()
fromKeyBinding
s Action@pavithraCS:欢迎您并保持微笑:-)