我有一个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)
的大小,但无论我在哪里点击,都会触发鼠标事件。
答案 0 :(得分:4)
您正在将JPanel添加到JFrame的contentPane中,这是一个使用BorderLayout的组件,一个不考虑大小或甚至大部分首选大小的布局,因此JPanel将填充整个JFrame的contentPane。给contentPane一个FlowLayout并设置JPanel的首选大小,你会看到一个区别。将来,给JPanel一个边框来查看它的边界。这将使调试变得容易。
答案 1 :(得分:2)
如果你不另外告诉它,你的JFrame将会BorderLayout
这样:
现在,如果你还没有告诉你的小组去哪里,它会进入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()
设置的大小仅在根据布局和其他属性重新计算之前有效。