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