Слушатель мыши Java JPanel не работает над его компонентами - PullRequest
2 голосов
/ 21 марта 2012

Каково решение этой проблемы?

Я добавил слушатель мыши в JPanel, но эта панель полна кнопок, которые покрывают всю область JPanel.

Пример (псевдо) код:

Create JPanel
Set to GridLayout
Add 25 buttons (5x5 grid)
Add MouseListener to JPanel

MouseListener / MouseMotionListener:

onMouseMove { print out X,Y co-ords of mouse }

Координаты никогда не распечатываются, пока я не доберусь до самого края контейнера JPanel, потому что кнопкиблокирование всего остального.

Как заставить слушатель мыши работать над всеми компонентами панели, не добавляя слушателя к каждому компоненту - или я должен добавить слушателя к каждому компоненту?

ДОБАВЛЕННАЯ ИНФОРМАЦИЯ: Я пытаюсь добавить жест касания для системы с сенсорным экраном (пролистывание панели вызывает действие).Я довольно уверен в том, что могу распознать этот жест, но я действительно искал «лучший» способ, чем добавить копию слушателя для каждого компонента (это было бы еще хуже для меня, потому что компоненты меняются).

Я собираюсь вместо этого попытаться добавить его в glassPane ... (в настоящий момент getRootPane () дает мне NullPointerException)

EDIT: Теперь я знаю, что яЯ пытаюсь получить метод RootPane () из JPanel, который не является корневым контейнером, поэтому я получаю null.Мне нужно сделать это на главном JFrame.

EDIT2: Хорошо, я сделал это (добавил стеклянную панель в основной JFrame), сначала у меня возникла проблема, потому что я несделать это:

myGlassPane.setVisible(true);

Так что, похоже, это не работает.Но как только я это сделал, все, что мне нужно было сделать, это установить для непрозрачного флага значение false, чтобы сделать его прозрачнымнад кнопками и все такое, однако кнопки не работают, потому что над ними есть панель.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Добавьте ваш слушатель как на панель, так и на кнопки.

1 голос
/ 22 марта 2012

Замените JButton пользовательской кнопкой.Перешлите нужные вам события от кнопки к ее родителю.Вот пример, который будет перенаправлять событие, введенное мышью.Отрегулируйте переадресацию и добавьте обработку исключений / ошибок при необходимости.

class JJButton extends JButton {
    {
        addMouseListener(new MouseAdapter(){
        public void mouseEntered(MouseEvent e) {
            if (JJButton.this.getParent()!=null){
                MouseListener[] ml = JJButton.this.getParent().getMouseListeners();
                for (MouseListener l : ml) {
                    l.mouseEntered(e);
                }
            }
        }
        });
    }
    public JJButton(String string) {
        super(string);
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...