Как использовать прослушиватель действий, чтобы проверить, была ли нажата определенная кнопка?

У меня есть 4 списка кнопок, расположенных в столбце в моей программе. На данный момент у меня есть 4 цикла, которые проверяют, была ли нажата кнопка или нет. Есть ли простой способ проверить, была ли нажата какая-либо кнопка, вместо того, чтобы перебирать каждый список, чтобы увидеть, была ли нажата эта определенная кнопка. Должен быть более простой способ проверить, если "actionSource == anybutton"...


person mbreen    schedule 04.09.2011    source источник


Ответы (3)


Используйте анонимные внутренние классы для каждой кнопки:

JButton button = new JButton("Do Something");
button.addActionListener( new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Do Something Clicked");
    }
});

Или, если ваша логика связана, вы можете поделиться слушателем:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonCalculator extends JFrame implements ActionListener
{
    private JButton[] buttons;
    private JTextField display;

    public ButtonCalculator()
    {
        display = new JTextField();
        display.setEditable( false );
        display.setHorizontalAlignment(JTextField.RIGHT);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout( new GridLayout(0, 5) );
        buttons = new JButton[10];

        for (int i = 0; i < buttons.length; i++)
        {
            String text = String.valueOf(i);
            JButton button = new JButton( text );
            button.addActionListener( this );
            button.setMnemonic( text.charAt(0) );
            buttons[i] = button;
            buttonPanel.add( button );
        }

        getContentPane().add(display, BorderLayout.NORTH);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        setResizable( false );
    }

    public void actionPerformed(ActionEvent e)
    {
        JButton source = (JButton)e.getSource();
        display.replaceSelection( source.getActionCommand() );
    }

    public static void main(String[] args)
    {
        UIManager.put("Button.margin", new Insets(10, 10, 10, 10) );
        ButtonCalculator frame = new ButtonCalculator();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}
person camickr    schedule 04.09.2011
comment
Camickr — авторитет Swing в моих глазах. - person duffymo; 04.09.2011
comment
Поделись слушателем... здорово, спасибо за совет! Это сработало отлично! - person mbreen; 04.09.2011

Вы можете добавить отдельный слушатель для каждой кнопки и один общий слушатель для каждой кнопки. Запрограммируйте обычного слушателя реагировать на «нажатие любой кнопки».

person duffymo    schedule 04.09.2011

Каждый раз, когда вы нажимаете кнопку, она запускает метод actionPerformed, независимо от того, какую кнопку вы нажали.

public void actionPerformed(ActionEvent event) {
    Object source = event.getSource();
    if (source instanceof JButton) System.out.println("You clicked a button!");
}
person fireshadow52    schedule 04.09.2011
comment
У меня все еще есть другие объекты со слушателями, такие как поля со списком и пункты меню. Мне нужны только кнопки для выполнения определенной задачи, а не все пункты со слушателем. - person mbreen; 04.09.2011