JButton кнопка — обработка нажатия

Каждое приложение, которое имеет графический интерфейс пользователя не может обходиться без кнопок. В Java Swing кнопка представлена классом JButton. У кнопки имеются различные методы для ее конфигурирования — установка надписи на JButton, установка иконки, выравнивание текста, установка размеров и так далее. Кроме всего прочего разработчику необходимо навесить на JButton слушателя, который будет выполняться как только пользователь нажмет на кнопку. Как это сделать? Поговорим об этом ниже.

Ранее я писал, что все взаимодействия пользователя с приложением основано на событиях. Не является исключением и JButton. Как только пользователь нажимает кнопку, создается ActionEvent событие, которое передается слушателям кнопки. Для того, чтобы организовать слушателя Swing предоставляет интерфейс ActionListener, который необходимо реализовать. Интерфейс ActionListener требует только реализации одного метода — actionPerformed. Пример класса, реализующего интерфейс ActionListener представлен ниже.

public class TestActionListener implements ActionListener {
     public void actionPerformed(ActionEvent e) {
          //Код, который нужно выполнить при нажатии
     }
}

После того, как обработчик создан, его необходимо добавить к кнопке. Делается это при помощи метода addActionListener. В качестве параметра методу передается обработчик. Например, это можно сделать вот так:

JButton button = new JButton("Test button");
ActionListener actionListener = new TestActionListener();
button.addActionListener(actionListener);

Здесь мы создаем сначала кнопку. Потом создаем экземпляр нашего слушателя TestActionListener, а затем добавляем его в качестве слушателя к кнопке с помощью вызова addActionListener и передаем ему экземпляр обработчика. Вообще слушателей может быть неопределенное количество. Если нам будет необходимо два или более слушателей, которые должны будут по-разному реагировать на нажатие кнопки, то для каждого из них вызовем addActionListener. Кроме того может когда-нибудь понадобиться отключить слушателя и сказать ему, чтобы он больше не прослушивал нажатие кнопки. Это можно сделать при помощи метода removeActionListener. Сюда в качестве параметра придется передать ссылку на слушателя, которого хотим удалить из списка слушателей кнопки JButton.

Ну и напоследок пример приложения для демонстрации обработчиков нажатия кнопки JButton.

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestFrame extends JFrame {

     private JTextField textField;

     public TestFrame() {
          super(«Test frame»);
          createGUI();
     }

     public void createGUI() {
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JPanel panel = new JPanel();
          panel.setLayout(new FlowLayout());

          JButton button1 = new JButton(«Button 1″);
          button1.setActionCommand(«Button 1 was pressed!»);
          panel.add(button1);

          JButton button2 = new JButton(«Button 2″);
          button2.setActionCommand(«Button 2 was pressed!»);
          panel.add(button2);

          JButton button3 = new JButton(«Button 3″);
          button3.setActionCommand(«Button 3 was pressed!»);
          panel.add(button3);

          textField = new JTextField();
          textField.setColumns(23);
          panel.add(textField);

          ActionListener actionListener = new TestActionListener();
          
          button1.addActionListener(actionListener);
          button2.addActionListener(actionListener);
          
          button3.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    textField.setText(e.getActionCommand());
               }
          });

          getContentPane().add(panel);
          setPreferredSize(new Dimension(320, 100));
     }

     public class TestActionListener implements ActionListener {
          public void actionPerformed(ActionEvent e) {
               textField.setText(e.getActionCommand());
          }
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    TestFrame frame = new TestFrame();
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
               }
          });
     }
}

Стоит сказать про несколько интересных на мой взгляд моментов. Первый — это использование action command. Можно заметить, что у кнопок вызывается метод setActionCommand, в который для каждой кнопки передает своё строковое значение. Таким образом в приложении можно понять, какая именно кнопка была нажата, если обработку нажатия нескольких кнопок выполняет один слушатель. Для того, чтобы узнать это у ActionEvent берется action command с помощью метода getActionCommand.

Второй момент — для обработки события нажатия кнопки JButton можно создать анонимный класс, который реализует интерфейс ActionListener. Это можно наблюдать вот здесь:

button3.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
          textField.setText(e.getActionCommand());
     }
});
Advertisements

20 Responses to JButton кнопка — обработка нажатия

  1. dzlk says:

    Я не понял, а как различить события и на разные события повесить разные экшены? Например, события наведения на кнопку, нажатия, получения фокуса и так далее.

    За статью спасибо, с удовольствием читаю.

    • bondforever says:

      ActionListener нужен только для обработки нажатия кнопки. Для прослушки мышиных событий (навел курсор мышки, убрал и так далее) нужен MouseListener. Для этого необходим класс, который реализует MouseListener (или анонимный). Создаем экземпляр такого класса и передаем в метод addMouseListener кнопки. Чтобы прослушивать фокусные события, делаем реализацию для FocusListener и добавляем слушателя с помощью addFocusListener.
      P.S. Попробую в ближайшее время запостить про обработку мышиных и фокусных событий.

  2. dzlk says:

    Теперь понятно, спасибо, продолжайте, я читаю 🙂

  3. Immortal says:

    У меня возникла необходимость по нажатии JButton запустить некоторый бесконечный цикл. Причем в цикле должен перерисовываться JFrame, на котором этот JButton расположен. Проблема в том, что JFrame не перерисовывается, пока не отработает ActionListener. Подскажите направления решения этой задачи, пожалуйста.

  4. badmod says:

    Меня тоже интересует вопрос с перерисовкой для решения задачи:
    есть JPanel и две JButton (+ и -). нажимаешь на кнопку + на JPanel добавляется новая Jlabel, нажимаешь на — удаляется последняя добавленная Jlabel.

  5. Стас says:

    Есть варварский способ +) зато быстрый и надежный
    берете ваш JFrame jf и в ActionListener пишите
    jf.remove(Component comp)
    jf.setVisible(false)
    jf.setVisible(true)

    где comp может быть и панель и кнопа и все что угодно =)

  6. Евгений says:

    Подскажите, можно сделать так, чтобы по нажатию кнопки выполнялся html код?

  7. Алексей says:

    Здравствуйте.
    Ради развлечения начал изучать Java.
    Не подскажете, почему листенер кнопки не может поменять текст на ней? В примере при слово «Test» только мелькает после отпускания ЛКМ.


    btn.setText("Button");
    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    btn.setText("Test");
    }
    });

  8. Jack says:

    Подскажите пожалуйста как организовать обработку таким образом, что при нажатии кнопки открывалось окно из этого проекта?

  9. kirgiz says:

    Здравствуйте, очень полезная статейка, но у меня есть вопрос, я хочу вынести листенер в отдельный файл, в вашем случае в нем есть привязка к полю textField, как лучше подскажите как изменить код для выноса оистенера. (Переопределить его конструктор, модификаторы доступа, и т.д.). Буду очень благодарен.

  10. Arkados says:

    A не подскажите как чделать что бы при нажатии на кнопку выводилост изображение созданое в методе Graphics?

  11. alex says:

    Пожалуйста, поменяйте ваш некомпилируемый код на:
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;

    public class TestFrame extends JFrame {

    private JTextField textField;

    public TestFrame() {
    super(«Test frame»);
    createGUI();
    }

    public void createGUI() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    panel.setLayout(new FlowLayout());

    JButton button1 = new JButton(«Button 1»);
    button1.setActionCommand(«Button 1 was pressed!»);
    panel.add(button1);

    JButton button2 = new JButton(«Button 2»);
    button2.setActionCommand(«Button 2 was pressed!»);
    panel.add(button2);

    JButton button3 = new JButton(«Button 3»);
    button3.setActionCommand(«Button 3 was pressed!»);
    panel.add(button3);

    textField = new JTextField();
    textField.setColumns(23);
    panel.add(textField);

    ActionListener actionListener = new TestActionListener();

    button1.addActionListener(actionListener);
    button2.addActionListener(actionListener);

    button3.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    textField.setText(e.getActionCommand());
    }
    });

    getContentPane().add(panel);
    setPreferredSize(new Dimension(320, 100));
    }

    public class TestActionListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    textField.setText(e.getActionCommand());
    }
    }

    public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    JFrame.setDefaultLookAndFeelDecorated(true);
    TestFrame frame = new TestFrame();
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
    });
    }
    }

  12. Alik says:

    Есть проблема. В программе есть несколько кнопок и JCkeckbox, от выбора последнего завист какую картинку-иконку повесить на кнопки. Но, картинки не присваиваються,хотя майн выполняется в отдельном потоке, а после выбора присутствует перерисовка панели содержашая кнопки. Может сможетеиразобраться, компилятор ошибок не выдает , он просто не отрисовыает картинки(

  13. Алексей says:

    alex: Я попробовал ваш код в эклипс копировать куча ошибок =)

  14. Namig says:

    как сделать так? что после ActionListener для JButton нельзя было снова нажать на кнопку?

  15. Сергей says:

    Такой вопрос. Обработчик начинает выполнять действие когда нажимаешь на кнопку. нажал и отпустил — и после того как отпустил начинает работать. Подскажите как сделать что бы срабатывал сразу после касания, а не после отпускания? мож команда какая? проект в эклипсе

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: