【发布时间】:2011-08-26 22:20:45
【问题描述】:
这里是演示我的问题的代码: 父类:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PPanel extends JPanel{
private APanel panel1;
private APanel panel2;
private APanel panel3;
public PPanel() {
this.setLayout(new GridLayout(0,1));
panel1 = new APanel();
panel1.setLayout(new GridLayout(0,1));
panel2 = new APanel();
panel2.setBackground(Color.yellow);
panel2.setLayout(new GridLayout(0,1));
panel3 = new APanel();
panel3.setBackground(Color.green);
//panel3.setLayout(new GridLayout(0,1));
this.add(panel1);
this.add(panel2);
this.add(panel3);
this.setBackground(Color.blue);
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Parent panel clicked!");
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame();
PPanel panel = new PPanel();
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(350, 300));
frame.setTitle("Demo");
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
子面板类:
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class APanel extends JPanel{
private JTextField tf;
public APanel() {
tf = new JTextField("Double click");
tf.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Textfiled");
Component source = (Component) e.getSource();
System.out.println(source.getParent());
source.getParent().dispatchEvent(e);
}
});
this.add(tf);
this.setVisible(true);
this.setBackground(Color.red);
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Child panel clicked!");
Component source = (Component) e.getSource();
System.out.println("Parent container of APanel is " + source.getParent());
if(source.getParent() instanceof PPanel)
source.getParent().dispatchEvent(e);
}
});
}
}
我希望一旦在 JTextField 中触发了 mouseClicked 事件,它将通过使用 dispatchEvent 传播到父面板。但是对于具有 JTextField 的子面板,似乎 MouseClicked 事件只能到达 APanel。然后它打印 APanel 的父级是 APanel!。所以在我看来,dispatchEvent 只将事件发送到下一个即时容器,而不是更多。
我该如何解决这个问题?有没有办法可以直接将事件分派到另一个容器?
【问题讨论】:
-
另外,我看到您正在使用
MouseListener,但只定义了一种方法 - 查看MouseAdapter,它提供了所有侦听器方法的空实现,允许您仅覆盖和定义您的方法'感兴趣。 -
哦,没关系。这个例子只是我的问题的一个基本演示,所以我必须减少到简单的方法(保持简短)来展示主要问题。
-
再次阅读我自己的评论,现在我意识到我没有全神贯注地回复您的评论。我的意思是我使用 Netbeans 编写了这个示例,因此它为我导入了所有这些方法。又快又脏!
-
正如您所注意到的,mouseEvents 会转到最感兴趣的组件(又名:是 mouseEnabled 或具有 mouseListeners),而不是进一步 - 有一个很好的理由:想象一下所有这些事件在容器中传播无论如何,大多数时候都不感兴趣的层次结构。那么,为什么要在父节点上看到 mouseEvent 呢?
-
@kleopatra:原因是我可以使用 mouseListener MouseClicked 和 MouseDragged 来移动和拖动主(父)面板。但是,添加了所有 3 个子面板后,它们是第一个与 mouseEvent 交互的,因此我无法拖动和移动主面板。将 mouseEvent 移到父面板让我再次拥有这个能力。
标签: swing events event-handling