【问题标题】:Implementing a clear button for a JFrame为 JFrame 实现清除按钮
【发布时间】:2012-02-17 08:11:56
【问题描述】:

我正在为一个由四个 JPanel 组成的 JFrame 实现一个清除按钮。每个 JPanel 都有几个文本字段、单选按钮和复选框。

当表单加载时,“清除”按钮应该被禁用。只有当用户在任何面板中的任何这些字段中输入一些值时,它才应该启用。

我尝试在面板中添加一个 KeyListener。但它没有正确获取事件。我必须为所有 UI 组件注册 KeyListener 吗?还有什么好的方法吗?

提前致谢!

【问题讨论】:

    标签: java swing event-handling


    【解决方案1】:

    要进行更改,您可以将ItemListener 添加到您的JCheckBoxJRadioButtons,对于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();
                }
            });
        }
    }
    

    【讨论】:

    • @pavithraCS:欢迎您并保持微笑 :-)
    【解决方案2】:

    KeyListener 不是为 Listening a Keyboards Swing GUI 中的事件指定的,因为 Swing 存在 KeyBindings

    【讨论】:

    • 但不确定,在这种情况下似乎 KeyListeners 会更合适,因为在键盘上绑定所有 26 个字母键和 10 个数字键以检查哪个键并不是一个好主意用户按下 JTextField。希望我没有错:-)
    • Swing Gurus 的某个人在这里计算好的KeyListenerKeyBindings 所需的字符数,通过计算代码中的字符没有直径差异,返回KeyBindings 只是为了调用JButton#doClick() 来自KeyBindings 行动JButton#doClick()
    【解决方案3】:

    您必须将 ActionListeners 添加到您的 JTextFields 中,然后检查文本字段中的文本值,例如:

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

    【讨论】:

    • 谢谢您的回答。但是表单中有很多文本字段。我想找到一个简单的解决方案。
    • 可以定义布尔标志,例如:boolean flag = !jTextField1.getText().equals("") || ... || !jTextFieldN.getText().equals(""); jButton.setEnabled(flag);
    【解决方案4】:

    它应该只在用户输入一些值时启用 任何面板中的那些字段。

    所以你应该为所有这些字段实现KeyListener 接口。在检测到用户的打字动作后,您应该启用该按钮。

    jButton.setEnabled(true);
    

    是否必须为所有 UI 组件注册 KeyListener?

    当然没有。编写一个扩展 JTextField 并实现 KeyListener 的类。从此类派生您的对象(所有文本字段)。如果你实现了你在击键时应该做的事情,那么所有这些对象都会遵守你的规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多