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

java: Why does frame get the event of a component

我有一个 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 一个 Border 以查看其边界。这将使调试变得如此简单。

如果您不另行说明,您的 JFrame 将 BorderLayout 如下所示:

现在,如果您不告诉面板去哪里,它将进入 CENTER 并因此调整大小以填充整个内容区域。

为了只在一个 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() 设置的大小仅在根据布局和其他属性重新计算之前有效。