【问题标题】:Overlapping panels重叠面板
【发布时间】:2017-09-18 03:04:07
【问题描述】:

我正在尝试制作重叠面板,但“最顶层”面板下方的小部件会以某种方式对鼠标事件做出反应并重新绘制事件并在顶层上方呈现。例如,这里我的底层有很多按钮和标签,顶层有向上/向下按钮,对于这个测试来说是完全不透明的(灰色背景): 这使用OverlayLayout 管理器将面板放置在不同的 Z 水平上。将鼠标悬停在按钮上时会弹出视图,而右侧的自动更新标签也会弹出视图。

SSCCE:

public class Temp extends JPanel {
    public static void main(String... args) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

            f.setContentPane(new Temp());

            f.setSize(500, 250);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        });
    }

    public Temp() {
        super(null);
        setLayout(new OverlayLayout(this));

        JButton bottom = new JButton("Bottom");
        JButton top    = new JButton("Top");

        bottom.setBounds(100, 50, 200, 100);
        top.setBounds(200, 100, 200, 100);

        // OverlayLayout adds components from top to bottom.
        add(new JPanel(null) {{
                setBackground(new Color(175, 150, 125));
                add(top);
            }});
        add(new JPanel(null) {{
                add(bottom);
            }});
    }
}

这基本上是我现在的做法。在鼠标悬停一点之后看起来像这样,但是通过悬停我可以将两个按钮中的任何一个放在另一个之上:

我的问题是,我怎样才能以最简单的方式解决这个问题,或者处理这个问题的标准方法是什么?也许是非模态无框架 JDialog?我反对该对话框的一个论点是,我不想让用户使用键盘快捷键在屏幕上移动它。

【问题讨论】:

  • 好的,可以了;只是一个没有布局管理器的小皮塔饼,它允许鼠标事件通过。将空鼠标适配器添加到顶部面板感觉就像是一种 hack。
  • 它只是一个容器,你可以根据需要应用一个布局管理器。我不确定你的第二条评论是什么意思,这就是所有容器的工作

标签: java swing layout


【解决方案1】:

还有一个带有向上/向下按钮的顶层,对于这个测试是完全不透明的(灰色背景):

拥有一个“不透明”的顶部面板是没有意义的。您将看不到底部面板上的按钮。顶部面板应该是透明的,底部面板应该是您的背景颜色。

我的问题是,我该如何解决这个问题

如果您指的是当您将鼠标悬停在每个按钮上时按钮 ZOrder 会不断变化,那么您需要在 Temp 面板(即使用 OverlayLayout 的面板)上覆盖以下方法:

@Override
public boolean isOptimizedDrawingEnabled()
{
    return false;
}

这基本上是说 Temp 面板可能包含重叠的组件,因此每次都需要在正确的 ZOrder 中重新绘制所有面板。

【讨论】:

  • 不透明只是为了测试。对于解决方案,我改用JLayeredPane,效果很好,除了鼠标点击。有什么解决办法吗?
  • The opaqueness was just for the sake of the test. - 代码和问题应该反映您实际在做什么,这样我们就不会花时间去追逐野鹅了。
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
相关资源
最近更新 更多