如何避免子 GUI 对象接管鼠标侦听器?
How to avoid child-GUI-objects to take over mouse listener?
我的 FatherPanel
通过鼠标进入(红色)/退出(橙色)鼠标事件改变颜色。效果很好,但是当我输入按钮 "Testbutton"(这是我父亲面板的子组件)时,会出现鼠标退出事件。但我还在我父亲的面板里。
有人可以向我解释为什么会出现这样的问题以及如何解决吗?
只要我的鼠标在该面板内,我希望父面板为橙色(无论鼠标是否在子对象上)。
public class MainFrame extends JFrame {
public MainFrame() {
FatherPanel fatherPanel = new FatherPanel();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800, 700);
setLayout(null);
add(fatherPanel);
fatherPanel.setBounds(150, 20, 300, 300);
}
public class FatherPanel extends JPanel{
JButton btn1 = new JButton("Testbutton");
public FatherPanel() {
setSize(300, 300);
setLayout(null);
setBackground(Color.RED);
add(btn1);
btn1.setBounds(150, 150, 100, 100);
addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
setBackground(Color.RED);
}
@Override
public void mouseEntered(MouseEvent e) {
setBackground(Color.ORANGE);
}
@Override
public void mouseClicked(MouseEvent e) {
}
});
}
}
}
在mouseExited事件中可以查看鼠标点是否还在父组件的边界内。
类似于:
addMouseListener(new MouseAdapter()
{
@Override
public void mouseExited(MouseEvent e)
{
Rectangle r = e.getComponent().getBounds();
Point p = e.getPoint();
if (p.x < 0 || p.x >= r.width
|| p.y < 0 || p.y >= r.height)
setBackground( Color.RED );
}
@Override
public void mouseEntered(MouseEvent e)
{
setBackground( Color.ORANGE );
}
});
注意:扩展 MouseAdapter
更容易,因为您只需要实现要处理的方法。
我的 FatherPanel
通过鼠标进入(红色)/退出(橙色)鼠标事件改变颜色。效果很好,但是当我输入按钮 "Testbutton"(这是我父亲面板的子组件)时,会出现鼠标退出事件。但我还在我父亲的面板里。
有人可以向我解释为什么会出现这样的问题以及如何解决吗?
只要我的鼠标在该面板内,我希望父面板为橙色(无论鼠标是否在子对象上)。
public class MainFrame extends JFrame {
public MainFrame() {
FatherPanel fatherPanel = new FatherPanel();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800, 700);
setLayout(null);
add(fatherPanel);
fatherPanel.setBounds(150, 20, 300, 300);
}
public class FatherPanel extends JPanel{
JButton btn1 = new JButton("Testbutton");
public FatherPanel() {
setSize(300, 300);
setLayout(null);
setBackground(Color.RED);
add(btn1);
btn1.setBounds(150, 150, 100, 100);
addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
setBackground(Color.RED);
}
@Override
public void mouseEntered(MouseEvent e) {
setBackground(Color.ORANGE);
}
@Override
public void mouseClicked(MouseEvent e) {
}
});
}
}
}
在mouseExited事件中可以查看鼠标点是否还在父组件的边界内。
类似于:
addMouseListener(new MouseAdapter()
{
@Override
public void mouseExited(MouseEvent e)
{
Rectangle r = e.getComponent().getBounds();
Point p = e.getPoint();
if (p.x < 0 || p.x >= r.width
|| p.y < 0 || p.y >= r.height)
setBackground( Color.RED );
}
@Override
public void mouseEntered(MouseEvent e)
{
setBackground( Color.ORANGE );
}
});
注意:扩展 MouseAdapter
更容易,因为您只需要实现要处理的方法。