Распространение событий Java остановлено

У меня есть главное окно:

public class MainPanel extends JFrame implements MouseListener {

   public MainPanel() {
      setLayout(new FlowLayout());
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      addMouseListener(this);

      ChildPanel child = new ChildPanel();
      add(child);

      JPanel spacer = new JPanel();
      spacer.setPreferredSize(new Dimension(50, 50));
      add(spacer);

      pack();
      setLocationRelativeTo(null);
   }

   @Override
   public void mouseClicked(MouseEvent e) {
      System.out.println("Mouse click event on MainPanel");
   }
}

И дочерний JPanel:

public class ChildPanel extends JPanel implements MouseListener {

   public ChildPanel() {
      setBackground(Color.RED);
      setPreferredSize(new Dimension(200, 200));
      //addMouseListener(this);
   }

   @Override
   public void mouseClicked(MouseEvent e) {
      System.out.println("Mouse click event on ChildPanel");
   }
}

С комментарием к addMouseListener на дочерней панели родитель получает события щелчка, когда я щелкаю в любом месте в окне, в том числе на ребенка. Если я раскомментирую этот вызов и нажму на дочернюю панель, только дочерний объект получит событие click, и оно не будет распространено на родительский.

Как я могу предотвратить использование этого события ребенком?

8
задан takteek 30 August 2010 в 23:53
поделиться

1 ответ

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

Однако вы можете получить желаемое поведение, но передайте JFrame в ChildPanel и вызовите его mouseClicked(MouseEvent) или любой другой метод, который вы хотите . Или просто получить родительский компонент.

   @Override
   public void mouseClicked(MouseEvent e) {
      System.out.println("Mouse click event on ChildPanel");
      this.frame.mouseClicked(e);
      getParent().mouseClicked(e);
   }
3
ответ дан 5 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

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