【问题标题】:Why does a JButton under a JPanel still react?为什么 JPanel 下的 JButton 仍然有反应?
【发布时间】:2015-12-29 21:00:39
【问题描述】:

我四处寻找我的问题,但找不到答案,所以我开始了:

我有一个 JLayeredPane,里面有 2 个 JPanel。 最深的(最下面)有 JButtons。 第二个(顶部的那个)具有部分透明的背景颜色(尽管我认为这不会影响它)。

现在,当我将鼠标悬停在我的 JButton(位于另一个 JPanel 后面)上时,它们仍然会向我添加到它们的 MouseListener 触发事件。不知道为什么……

为什么会这样?我该怎么做才能让它停止?

在这里,我将两个面板都添加到分层窗格中,这是指我的扩展 JFrame 的类。

    JLayeredPane layer = this.getLayeredPane();
    layer.removeAll();

    this.gamePanel = new GamePanel(game);


    this.ghostPanel = new GhostPanel();
    this.ghostPanel.setOpaque(true);
    this.ghostPanel.setVisible(true);

    layer.add(this.gamePanel, new Integer(0));
    layer.add(this.ghostPanel, new Integer(1));

我在最下面的面板中添加了一些按钮(具有绝对布局)

    this.setLayout(null);
    for (int j = 0; j < 5; j++) {
        for (int i = 0; i < 5 + j; i++) {
            this.add(this.buttons[i][j]);
        }
    }
    for (int j = 1; j < 5; j++) {
        for (int i = j; i < 9; i++) {
            this.add(this.buttons[i][4 + j]);
        }
    }

这里指的是最底层的JPanel

本作的目的是一款名为 gipf 的游戏,而我采用的布局是绝对的,因为很难将所有东西对齐成六边形。

【问题讨论】:

  • 请分享你所做的。

标签: java swing jbutton mouselistener jlayeredpane


【解决方案1】:

现在,当我将鼠标悬停在我的 JButton(位于另一个 JPanel 后面)上时,它们仍然会向我添加到它们的 MouseListener 触发事件

当一个事件产生时需要传递给一个组件,所以Swing从父/子层次结构的底部向上搜索,直到找到一个想要处理该事件的组件。

我该怎么做才能让它停止?

在顶部面板中添加MouseMotionListener 以拦截mouseEntered/mouseExited 等事件。这样您仍然可以处理其他面板中的按钮点击。

【讨论】:

  • 非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2022-12-19
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多