java:为什么frame会获取组件的事件
我有一个JFrame,它只包含一个JPanel。java:为什么frame会获取组件的事件,java,swing,mouseevent,Java,Swing,Mouseevent,我有一个JFrame,它只包含一个JPanel。 我将鼠标事件添加到JPanel。 但是整个JFrame会得到相同的鼠标事件。 这是我的代码: public class TestSwing extends JPanel { public TestSwing() { super.setSize(20, 20); addMouseListener(new MouseAdapter() { public void mo
我将鼠标事件添加到JPanel。
但是整个JFrame会得到相同的鼠标事件。
这是我的代码:
public class TestSwing extends JPanel {
public TestSwing() {
super.setSize(20, 20);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
System.out.println(me);
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new TestSwing());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
frame.setVisible(true);
}
}
我设置了JPanel的大小
(20,20)
,但无论我在哪里单击,鼠标事件总是会被触发。您将该JPanel添加到JFrame的contentPane中,该组件使用BorderLayout,该布局不考虑大小,甚至不考虑大部分首选大小,因此JPanel将填充整个JFrame的contentPane。给contentPane一个FlowLayout并设置JPanel的首选大小,您将看到不同之处。将来,给JPanel一个边界以查看其边界。这将使调试变得容易。您将该JPanel添加到JFrame的contentPane中,该组件使用BorderLayout,该布局不考虑大小,甚至不考虑大部分首选大小,因此JPanel将填充整个JFrame的contentPane。给contentPane一个FlowLayout并设置JPanel的首选大小,您将看到不同之处。将来,给JPanel一个边界以查看其边界。这将使调试变得容易。如果您不告诉它,您的JFrame将如下所示:
现在,如果你不告诉你的面板去哪里,它会进入中心
,从而调整大小以填充整个内容区域
要仅在一个JPanel
上检查MouseEvent
,我建议您在其他区域添加另一个JPanel(可能具有不同的背景?)
frame.getContentPane().add(new TestSwing(), BorderLayout.CENTER);
JPanel left = new JPanel();
left.setBackground(Color.red);
frame.getContentPane().add(left, BorderLayout.LEFT);
由
setSize()
设置的大小仅在根据布局和其他属性重新计算之前有效 如果您不告诉它,您的JFrame将如下所示:
现在,如果你不告诉你的面板去哪里,它会进入中心
,从而调整大小以填充整个内容区域
要仅在一个JPanel
上检查MouseEvent
,我建议您在其他区域添加另一个JPanel(可能具有不同的背景?)
frame.getContentPane().add(new TestSwing(), BorderLayout.CENTER);
JPanel left = new JPanel();
left.setBackground(Color.red);
frame.getContentPane().add(left, BorderLayout.LEFT);
由setSize()
设置的大小仅在根据布局和其他属性重新计算之前有效