为JFrame实现一个清除按钮

时间:2012-02-17 08:11:56

标签: java swing event-handling

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

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

我尝试将KeyListener添加到面板中。但它没有正确地得到事件。我是否必须为所有UI组件注册KeyListener?还有其他好办法吗?

提前致谢!

4 个答案:

答案 0 :(得分:5)

要进行更改,您可以将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();
            }
        });
    }
}

答案 1 :(得分:4)

Swing GUI中没有为KeyListener Keyboards个事件指定

Listening,因为Swing存在KeyBindings

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

  

只有在用户输入任何值时才应启用它   任何小组中的那些字段。

因此,您应该为所有这些字段实现KeyListener接口。在检测到用户的键入操作后,您应该启用该按钮。

jButton.setEnabled(true);
  

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

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