java:为什么frame会获取组件的事件

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

我有一个JFrame,它只包含一个JPanel。
我将鼠标事件添加到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()
设置的大小仅在根据布局和其他属性重新计算之前有效