У меня есть JPanel с CardLayout и двумя картами. Я хочу, чтобы макет переворачивал карты каждый раз, когда мышь входит или выходит из панели. Это работает нормально, если только одна из карт не является компонентом, который прослушивает события мыши. Рассмотрим следующий пример:
JPanel cardLayoutPanel = new JPanel(layout);
JButton button = new JButton("listening!");
JLabel label = new JLabel("not listening.");
cardLayoutPanel.add(button);
cardLayoutPanel.add(label);
layout.last(cardLayoutPanel);
cardLayoutPanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("entered!");
layout.next(cardLayoutPanel);
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("exited!");
layout.next(cardLayoutPanel);
}
});
Проблема в том, что если MouseEvent отлавливается дочерним компонентом, он не обрабатывается родительским объектом как чтение во многих SO-вопросах, связанных с этой топикой * 1016. *. Я пробовал разные вещи, такие как повторная отправка события или просто игнорирование события выхода, если событие, если координаты события все еще находятся на панели.
Первое решение вообще не работает, второе и с тех пор событие ввода мышью больше не происходит.
Как я могу решить эту проблему?
Единственное решение, которое я вижу сейчас, - полностью удалить слушателя из дочернего компонента и самостоятельно выполнить обработку столкновений и событий в родителях. мышь слушатель мыши, но это было бы беспорядок, а не предполагаемый способ сделать это, я думаю.
Любая помощь или идеи приветствуются.
РЕДАКТИРОВАТЬ: вот полный короткий компилируемый пример:
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class CardLayoutTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel content = new JPanel();
content.setBorder(new EmptyBorder(new Insets(50, 50, 50, 50)));
CardLayout layout = new CardLayout();
JPanel cardLayoutPanel = new JPanel(layout);
JButton button = new JButton("listening!");
JLabel label = new JLabel("not listening.");
cardLayoutPanel.add(button);
cardLayoutPanel.add(label);
layout.last(cardLayoutPanel);
cardLayoutPanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("entered!");
layout.next(cardLayoutPanel);
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("exited!");
layout.next(cardLayoutPanel);
}
});
content.add(cardLayoutPanel);
frame.add(content);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}