Как я могу получить все события от нажатия мыши в JFrame/Swing?

Вы проверили Phalanger? Это компилирует PHP в код.NET. Вот некоторые сравнительные тесты , которые показывают, что это может существенно улучшить производительность.

9
задан Rob Mayhew 27 July 2009 в 03:49
поделиться

5 ответов

Используйте AWTEventListener для фильтрации событий MouseEvents:

long eventMask = AWTEvent.MOUSE_MOTION_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK;
Toolkit.getDefaultToolkit().addAWTEventListener( new AWTEventListener()
{
    public void eventDispatched(AWTEvent e)
    {
        System.out.println(e);
    }
}, eventMask);
18
ответ дан 4 December 2019 в 08:02
поделиться

Вы можете добавить GlassPane по всему JFrame, добавить к нему MouseInputAdapter , чтобы захватывать все возможные события мыши, а затем использовать [SwingUtilities. getDeepestComponentAt ()] [3] для получения фактического компонента и [SwingUtilities.convertMouseEvent ()] [4] для делегирования события мыши из стеклянной панели фактическому компоненту.

Однако я не уверен в производительности влияние этого - в отличие от KeyEventDispatcher, которому просто нужно запускать событие всякий раз, когда нажимается клавиша, несколько событий генерируются, когда пользователь перемещает мышь - и в отличие от KeyEventDispatcher, вам необходимо повторно отправить событие нижнему компоненту, чтобы он справиться с этим.

(Извините - stackoverflow неправильно обрабатывает ссылки на методы SwingUtilities ... ссылки отображаются ниже, а не в тексте.)

[3]: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#getDeepestComponentAt (java.awt.Component , int, int) [4]: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#convertMouseEvent (java.awt.Component , java.awt. event.MouseEvent, java.awt.Component)

7
ответ дан 4 December 2019 в 08:02
поделиться

Вы должны использовать glassPane JFrame: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JFrame.html#getGlassPane ()

Просто получите стеклянную панель JFrame с помощью frm.getGlassPane ( ) и используйте на нем addMouseListener (), чтобы захватить все события мыши внутри окна.

2
ответ дан 4 December 2019 в 08:02
поделиться

Реализовать все прослушиватели, связанные с мышью, в классе и зарегистрировать этот класс в качестве обработчика для всех событий, связанных с мышью.

Интерфейсы, связанные с мышью, будут

MouseListener MouseMotionListener MouseWheelListener

0
ответ дан 4 December 2019 в 08:02
поделиться

Возможно, вы захотите реализовать подкласс MouseAdapter , абстрактный класс, который предоставляет пустые реализации всех методов, определенных в Mouse * Listener Интерфейсы. Как только вы это сделаете, вы можете зарегистрировать его в дочерних компонентах как MouseListener , когда они будут созданы. Когда вы укажете, что ваши компоненты «меняются», вы захотите убедиться, что вы также отменили регистрацию слушателя, если вы надеетесь выпустить свои компоненты в течение жизненного цикла JFrame.

0
ответ дан 4 December 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: