MouseExited на JPanel работает, когда JButton в панели завис? - PullRequest
1 голос
/ 25 марта 2011

У меня есть JPanel (назовем его ctrlPanel), и с помощью нулевого макета я поместил JLabel на задний план.На вершине этого ярлыка у меня есть еще один JLabel и JButton (по умолчанию скрытый).Я хотел бы показать эту метку и кнопку, когда пользователь наводит курсор мыши на ctrlPanel.

Он работает (почти) нормально, добавляя mouseAdapter в ctrlPanel и вызывая showControls (), когда mouseEntered и hideControls ()когда mouseExited.Они используют setVisible, чтобы показать / скрыть компоненты сверху.

Однако, когда пользователь наводит курсор на JButton, кажется, что ctrlPanel получает вызов mouseExited, и это заставляет JButton "мерцать" (mouseExited-> mouseEntered-> mouseExited и т. Д.).Что не имеет смысла для меня, потому что JButton в ctrlPanel.Я имею в виду, нет проблем при наведении курсора на JLabel.

Ответы [ 3 ]

1 голос
/ 21 октября 2014

Что я сделал для решения этой проблемы и как в ответе Иксулы:

"проверить координату в mouseExited (), и, если мышь все еще находится внутри панели, игнорировать это событие"

public void mouseExited(MouseEvent e) {
    if(stillInPanel(e.getPoint())) return;
    // Exit logic
}

private boolean stillInPanel(Point2D p) {
    return (YOURJPANEL.contains((Point)p));
}

Где YOURJPANEL может быть любым контейнером.

1 голос
/ 25 марта 2011

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

  • создать прослушиватель мыши и прикрепить его к панели, кнопкам и т. Д., И правильно обрабатывать материал повсюду
  • проверить координаты в mouseExited (), и еслимышь все еще находится внутри панели, игнорируйте это событие
0 голосов
/ 29 марта 2011

Я тоже это проверял и был удивлен, обнаружив такие же результаты.Я предполагаю, что компоненты Java не обрабатывают события мыши и мыши так же, как JavaScript и HTML (посредством всплытия событий).Использование другого менеджера компоновки не дало никакого эффекта.

Я думаю, что это самый безопасный способ решения проблемы: создайте собственный класс JPanel, который переопределяет методы add().Это делегирует super.add(), но также добавляет свой собственный прослушиватель мыши для каждого передаваемого компонента. Таким образом, вы по-прежнему будете получать события ввода и выхода мыши, но вы сможете отслеживать элементы внутри панели.,Что бы вы ни делали, когда мышь выходит из панели, она вступит в силу очень быстро и будет отменена сразу же после запуска следующего события.Вы не должны видеть никаких видимых изменений в GUI, но если вы видите мерцание, попробуйте сделать ваше окно с двойной буферизацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...