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

时间:2015-12-21 11:29:07

标签: java swing mouseevent

我有一个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)的大小,但无论我在哪里点击,都会触发鼠标事件。

2 个答案:

答案 0 :(得分:4)

您正在将JPanel添加到JFrame的contentPane中,这是一个使用BorderLayout的组件,一个不考虑大小或甚至大部分首选大小的布局,因此JPanel将填充整个JFrame的contentPane。给contentPane一个FlowLayout并设置JPanel的首选大小,你会看到一个区别。将来,给JPanel一个边框来查看它的边界。这将使调试变得容易。

答案 1 :(得分:2)

如果你不另外告诉它,你的JFrame将会BorderLayout这样:

enter image description here

现在,如果你还没有告诉你的小组去哪里,它会进入CENTER,因此需要调整大小以填满整个内容区域。

仅在一个MouseEvent上检查JPanel我建议你将另一个JPanel(可能有不同的背景?)添加到其他区域:

frame.getContentPane().add(new TestSwing(), BorderLayout.CENTER);
JPanel left = new JPanel();
left.setBackground(Color.red);
frame.getContentPane().add(left, BorderLayout.LEFT);

setSize()设置的大小仅在根据布局和其他属性重新计算之前有效。