1

我有一个 GUI,上面有一堆堆叠在一起的 jPanel。哪个“在顶部”由 jLayeredPane 控制。但是,当悬停在按钮和表单不在顶部时,它们变得可见且可交互。

我怎样才能使面板“实心”,即使底层组件不会“弹出”?

4

3 回答 3

4

我建议您使用 aCardLayout来完成此任务。

于 2011-09-07T09:00:05.657 回答
3

那么什么时候应该JLayeredPane使用a呢?

Layered Pane当您希望不同的图层同时可见时使用。用于CardLayout替换整个窗格。

于 2011-09-07T10:02:35.987 回答
3

自 jdk7 起可用的阻止 mouseEvents 的技术解决方案是 JLayer(我仍在使用它,这就是我偶尔展示它的原因:-)

public static class MouseBlockerUI extends LayerUI<JComponent> {

    @Override
    protected void processMouseEvent(MouseEvent e, JLayer l) {
        JLayeredPane layeredPane = (JLayeredPane) l.getParent();
        if (layeredPane.getLayer(l) != layeredPane.highestLayer())
            e.consume();
    }

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        JLayer jlayer = (JLayer)c;
        jlayer.setLayerEventMask(
                AWTEvent.MOUSE_EVENT_MASK 
        );
    }

    @Override
    public void uninstallUI(JComponent c) {
        JLayer jlayer = (JLayer)c;
        jlayer.setLayerEventMask(0);
        super.uninstallUI(c);
    }

}

然后将面板包装成 JLayer 并将 JLayer 添加到 JLayeredPane:

layeredPane.add(new JLayer(myPanel, new MouseBlockerUI(), someLayer));
于 2011-09-07T10:25:03.550 回答