Реализация кнопки очистки для JFrame - PullRequest
2 голосов
/ 17 февраля 2012

Я реализую кнопку очистки для JFrame, который состоит из четырех JPanels. Каждый JPanel имеет несколько текстовых полей, переключателей и флажков.

При загрузке формы «очистить» кнопки следует отключить. Его следует включать только тогда, когда пользователь вводит какое-либо значение в любое из этих полей на любой панели.

Я пытался добавить KeyListener на панели. Но он не получает события должным образом. Нужно ли регистрировать KeyListener для всех компонентов пользовательского интерфейса? Любой другой хороший метод?

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 17 февраля 2012

Для внесения изменений вы можете добавить 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();
            }
        });
    }
}
4 голосов
/ 17 февраля 2012

KeyListener не предназначен для Прослушивания a Keyboards событий в графическом интерфейсе Swing, для Swing есть KeyBindings

1 голос
/ 17 февраля 2012

Он должен быть включен, только когда пользователь ввел какое-либо значение в любое из этих полей на любой панели.

Таким образом, вы должны реализовать интерфейс KeyListener для всех этих полей.При обнаружении действия пользователя на клавиатуре вы должны активировать кнопку.

jButton.setEnabled(true);

Нужно ли регистрировать KeyListener для всех компонентов пользовательского интерфейса?

Конечно нет.Напишите класс, который расширяет JTextField и реализует KeyListener.Получите ваши объекты (все текстовые поля) из этого класса.Если вы реализуете то, что должны делать при нажатии клавиш, все эти объекты будут подчиняться вашему правилу.

1 голос
/ 17 февраля 2012

Вы должны добавить ActionListeners в ваши JTextFields, после этого проверьте текстовое значение в текстовых полях, например:

jButton.setEnabled(!jTextField.getText().equals("")); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...