MouseListener в Java

567
04 января 2017, 02:11

Как отловить события mousePressed и mouseReleased где в этот момент находится курсор, а потом получить объект над которым это событие происходит? Можно пример?

Answer 1

Рано или поздно возникает необходимость прослушивать события мыши от компонента. Для чего это может понадобится? Думаю много для чего. Например, недавно мне необходимо было сделать выделение строки правой кнопкой мыши в таблице. Здесь я использовал MouseListener для прослушивания событий мыши компонента. Для того, чтобы прослушивать события мыши необходимо реализовать интерфейс MouseListener, который располагается в пакете java.awt.event. По аналогии с другими слушателями swing, MouseListener — это интерфейс, методы которого необходимо реализовать. Рассмотрим методы, которые требуют реализации. Всего их пять. Условно методы можно разделить на две части. Первые два метода, говоря простым языком, отвечают за движение курсора, то есть будут вызываться при движении курсора мыши (навели и убрали курсор с компонента). Остальные три будут вызываться при нажатии кнопок. Методы очень простые и подробного описания думаю им не надо. Начнем рассмотрение с mouseEntered. Данный метод будет вызываться системой у слушателя каждый раз, когда курсор мыши будет оказываться над компонентом. В противоположность этому методу — mouseExited. Он срабатывает, когда убираем курсор мыши с компонента. Пример — у нас есть компонент. Мы добавили к нему слушателя MouseListener. Начинаем водить мышкой. Как только «залезли» курсором на компонент — вызвался mouseEntered, уводим курсор с компонента — вызвался mouseExited. Идем дальше. Каждый раз при нажатии одной из кнопок мыши будет срабатывать mousePressed. Навели на компонент, зажали кнопку — система вызвала mousePressed. Отпускаем кнопку — mouseReleased. Здесь всё просто. И самое интересное — это mouseClicked. По идее клик (click) — это когда пользователь нажал и отпустил одну из кнопок, но тут тоже есть свой момент. Если позиция курсора не меняется между зажатием и отпусканием кнопки, то mouseClicked срабатывает, если же зажали кнопку, сменили положение курсора — передвинули его куда-нибудь, но не убрали с компонента а затем отпустили, то mouseClicked не вызовется. Интерфейс MouseListener реализован, что дальше? Дальше нужно добавить слушателя к компоненту при помощи метода addMouseListener и прослушивать события. В случае необходимости можно удалить слушателя при помощи removeMouseListener. Рассмотрим тестовое приложение. Здесь располагается кнопка. Если поиграться с курсором и мышью, то внизу кнопки будет показываться текстовая надпись о наступлении событий — вызове методов слушателя.

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()");
          }
     }
}

Источник Источник информации

READ ALSO
Screen overlay после появление окна с permissions

Screen overlay после появление окна с permissions

Получаю "Screen overlay detected, To change this permission setting", you first have to turn off the screen overlay from Settings > Apps" (на Samsung S7 Edge), после нажатия Allow в окне с permissions, на Samsung S6 такой...

453
Как получать координаты в потоке?

Как получать координаты в потоке?

Есть приложение в нём через google api client получаю данные о моём местоположении, если точнее — широту и долготуМожно ли это делать в потоке или...

451
Создание BigInteger из String

Создание BigInteger из String

Как избавиться от IntegerparseInt в строке:

507
PreferenceActivity в API 25

PreferenceActivity в API 25

Вычитал в интернете про создание активити настроек для приложенияВо всех статьях, что я нашёл использовался метод addPreferencesFromResource():

506