MouseListener — слушаем мышь

Рано или поздно возникает необходимость прослушивать события мыши от компонента. Для чего это может понадобится? Думаю много для чего. Например, недавно мне необходимо было сделать выделение строки правой кнопкой мыши в таблице. Здесь я использовал MouseListener для прослушивания событий мыши компонента. Для того, чтобы прослушивать события мыши необходимо реализовать интерфейс MouseListener, который располагается в пакете java.awt.event. По аналогии с другими слушателями swing, MouseListener — это интерфейс, методы которого необходимо реализовать. Рассмотрим методы, которые требуют реализации. Всего их пять. Условно методы можно разделить на две части. Первые два метода, говоря простым языком, отвечают за движение курсора, то есть будут вызываться при движении курсора мыши (навели и убрали курсор с компонента). Остальные три будут вызываться при нажатии кнопок.

Методы очень простые и подробного описания думаю им не надо. Начнем рассмотрение с mouseEntered. Данный метод будет вызываться системой у слушателя каждый раз, когда курсор мыши будет оказываться над компонентом. В противоположность этому методу — mouseExited. Он срабатывает, когда убираем курсор мыши с компонента. Пример — у нас есть компонент. Мы добавили к нему слушателя MouseListener. Начинаем водить мышкой. Как только «залезли» курсором на компонент — вызвался mouseEntered, уводим курсор с компонента — вызвался mouseExited.

Идем дальше. Каждый раз при нажатии одной из кнопок мыши будет срабатывать mousePressed. Навели на компонент, зажали кнопку — система вызвала mousePressed. Отпускаем кнопку — mouseReleased. Здесь всё просто. И самое интересное — это mouseClicked. По идее клик (click) — это когда пользователь нажал и отпустил одну из кнопок, но тут тоже есть свой момент. Если позиция курсора не меняется между зажатием и отпусканием кнопки, то mouseClicked срабатывает, если же зажали кнопку, сменили положение курсора — передвинули его куда-нибудь, но не убрали с компонента а затем отпустили, то mouseClicked не вызовется.

Интерфейс MouseListener реализован, что дальше? Дальше нужно добавить слушателя к компоненту при помощи метода addMouseListener и прослушивать события. В случае необходимости можно удалить слушателя при помощи removeMouseListener.

Рассмотрим тестовое приложение. Здесь располагается кнопка. Если поиграться с курсором и мышью, то внизу кнопки будет показываться текстовая надпись о наступлении событий — вызове методов слушателя.

mouselistener_using

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

public class TestFrame extends JFrame {

     private JLabel eventLabel;

     public TestFrame() {
          super("Test frame");

          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JPanel mainPanel = new JPanel();
          mainPanel.setLayout(new BorderLayout());

          JPanel buttonsPanel = new JPanel();

          JButton button1 = new JButton("Button 1");
          button1.setPreferredSize(new Dimension(150, 80));
          buttonsPanel.add(button1);

          button1.addMouseListener(new CustomListener());

          mainPanel.add(buttonsPanel, BorderLayout.NORTH);

          eventLabel = new JLabel();
          eventLabel.setHorizontalAlignment(JLabel.CENTER);
          mainPanel.add(eventLabel, BorderLayout.CENTER);

          getContentPane().add(mainPanel);
     }

     public static JLabel createEmptyLabel() {
          JLabel label = new JLabel();
          label.setPreferredSize(new Dimension(100, 35));
          return label;
     }

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

     public class CustomListener implements MouseListener {

          public void mouseClicked(MouseEvent e) {
               JButton button = (JButton) e.getSource();
               String text = "<html><b>" + button.getText()
                         + " mouseReleased() <br>" + button.getText()
                         + " mouseClicked() </b><html>";
               eventLabel.setText(text);
          }

          public void mouseEntered(MouseEvent e) {
               JButton button = (JButton) e.getSource();
               eventLabel.setText(button.getText() + " mouseEntered()");
          }

          public void mouseExited(MouseEvent e) {
               JButton button = (JButton) e.getSource();
               eventLabel.setText(button.getText() + " mouseExited()");
          }

          public void mousePressed(MouseEvent e) {
               JButton button = (JButton) e.getSource();
               eventLabel.setText(button.getText() + " mousePressed()");
          }

          public void mouseReleased(MouseEvent e) {
               JButton button = (JButton) e.getSource();
               eventLabel.setText(button.getText() + " mouseReleased()");
          }
     }
}

7 Responses to MouseListener — слушаем мышь

  1. badmod:

    спасибо, очень полезно! еще бы хотелось узнать об обработке клавишных событий!

  2. nofeb:

    Спасибо! Информация полезна и доступна для понимания. Отличная статья!

  3. Михаил:

    Спасибо за ваш труд. Мне интересно как отслеживать события колёсика мыши, нажатие, вращение и как отследить сложное действие, допустим нажатие мыши при зажатом Alt.
    Зарание благодарю.

  4. Александр:

    Спасибо, просто и понятно, но в следующий раз, если не затруднит, в листинге добавьте коментарии.

  5. Vladivir:

    по неопытности не понял где используется createEmptyLabel

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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