В MouseListener для JPanel отсутствуют события mouseClicked - PullRequest
9 голосов
/ 01 августа 2010

У меня есть JPanel, для которого я создал MouseListener, и я вижу поведение, которое не могу объяснить.

Обычно, когда я щелкаю мышью внутри JPanel, я вижу следующие события:

mousePressed
mouseReleased
mouseClicked

В некоторых случаях я не вижу срабатывания события mouseClicked, я вижу только:

mousePressed
mouseReleased

Не думаю, что я делаю что-то необычное, когда нажимаю на это время. Кто-нибудь может объяснить, почему я не вижу событие mouseClicked?

Я не уверен, что это уместно, но у меня на панели запущена анимация с использованием javax.swing.Timer.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: добавление тестового кода, который воспроизводит проблему. Я не уверен, но мне интересно, имеет ли моя мышь какое-либо отношение к этому. У меня есть одна из тех сверхчувствительных игровых мышей (из моих старых дней COD4).

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

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Test {

    public static void main(String[] args) {
        final Test test = new Test();
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                test.createAndShowGUI();
            }
        });
    }

    protected void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(1024, 768));
        frame.setTitle("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setBackground(Color.WHITE);

        panel.addMouseListener(new MouseListener() {
            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println(":MOUSE_RELEASED_EVENT:");
            }
            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("----------------------------------\n:MOUSE_PRESSED_EVENT:");
            }
            @Override
            public void mouseExited(MouseEvent e) {
                System.out.println(":MOUSE_EXITED_EVENT:");
            }
            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println(":MOUSE_ENTER_EVENT:");
            }
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println(":MOUSE_CLICK_EVENT:");
            }
        });

        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

}

Ответы [ 4 ]

16 голосов
/ 10 июня 2011

за http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html:

"Вы увидите отпущенное мышью событие. Если вы не двигали мышь, последует событие, вызванное нажатием мыши."

У меня просто была эта проблема. Если вы передвинете мышь ВСЕ, событие, по которому щелкнули, не произойдет. Я действительно понятия не имею, какой хороший щелчок мышью дает эти знания. Я исправил это с помощью mouseReleased и проверил, была ли мышь внутри объекта:

public void mouseReleased(MouseEvent e) {
    if(objectWithListener.contains(e.getPoint())){
        doClickAction();
    }
}
3 голосов
/ 03 августа 2010

Я думаю, что нашел проблему здесь. Я получал промежуточные события mouseDragged между mousePress и mouseRelease. mouseMoved, похоже, не вызывает проблемы, но mouseDragged сделал.

Я не уверен в правильном решении сейчас, но по крайней мере теперь я могу объяснить, что происходит.

Приветствия

-Билль

0 голосов
/ 17 сентября 2013

В случаях, когда все, что я хочу, это событие clicked, тогда я использую простой ActionListener вместо MouseListner. Событие actionPerformed для кнопок и так далее, по крайней мере, запускается точно так же, как мы хотим, чтобы событие щелчка было, т.е. пока мышь находится на том же элементе управления во время отпускания, как и во время нажатия, actionPerformed событие будет запущено.

0 голосов
/ 26 февраля 2013

Пара предложений для тех, у кого возникла эта проблема.

Первое: возможно, ваша мышь стареет. У меня было странное поведение, и оказалось, что мышь иногда выбрасывала координаты, которые были далеко, и затем она возвращалась в исходное положение. Это даст события перетаскивания мыши. Попробуйте другую мышь ...

Во-вторых: у меня была проблема, когда мне был нужен jPanel (A), на котором я рисовал, установленный как макет BorderLayout.CENTER внутри другого jPanel (B), который сам был внутри jScrollPane.

При изменении размера jPanel (B) панель чертежа (A) будет масштабироваться до правильного размера из-за менеджера компоновки BorderLayout, но (A) будет игнорировать любые щелчки за пределами своих исходных размеров, если (A) теперь больше его оригинальный размер.

Когда размер jPanel (B) был изменен, менеджер компоновки не устанавливал размеры (A) на новый размер, когда он масштабировался (A), чтобы соответствовать центру jPanel (B). Событие щелчка мышью будет запускаться только для щелчков внутри исходных размеров jPanel (A). Мне пришлось вручную установить размер jPanel (A) для его новых масштабированных размеров, чтобы получить щелчки мышью для всех областей jPanel (A).

...