在不破坏布局的情况下隐藏JPanel

时间:2011-11-15 08:53:16

标签: java swing layout awt

我有一个屏幕,其中我放置了3个面板,如

  • 主要面板
    • 左侧小组
    • 右侧小组

展位面板将具有父面板尺寸的一半。 我想隐藏左侧面板,而不会破坏布局。并且没有chaning布局管理器(这在我的要求'BorderLayout'中以某种方式硬编码)。右侧面板的尺寸仍应为主面板的一半。

我的解决方案: 我重写了paint方法并添加了一个布尔值'propHideContents'。

@Override
public void paintComponents(Graphics g) {
    if (propHideContents && isVisible()) {
        paintBlankPanel(g);
        return;
    }
    super.paintComponents(g);
}

@Override
protected void paintChildren(Graphics g) {
    if (propHideContents && isVisible()) {
        paintBlankPanel(g);
        return;
    }
    super.paintChildren(g);
}

private void paintBlankPanel(Graphics g) {

    Graphics scratchGraphics = (g == null) ? null : g.create();
    try {
        scratchGraphics.setColor(this.getBackground());
        scratchGraphics.clipRect(0, 0, this.getWidth(), this.getHeight());
    } finally {
        scratchGraphics.dispose();
    }
}

隐藏逻辑看起来像

public void setPropHideContents(boolean propHideContents) {
    if (this.propHideContents != propHideContents) {
        this.propHideContents = propHideContents;
        setEnabled(!propHideContents);
        if (getParent() != null) {
            getParent().repaint();
        }
    }
}

几乎所有东西都有效,但我确实在下面的测试用例中有刷新问题

我在屏幕上添加了2个按钮。一个用于更改可见性状态,另一个用于隐藏状态。

展位面板隐藏且未显示。如果我现在按下“可见性”按钮,则会在隐藏面板的区域中绘制按钮。如果我使用鼠标光标手动更改屏幕大小,重绘事件将刷新隐藏的面板,并删除错误绘制的对象。

  1. 我该如何处理这些案件?
  2. 有人有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

而不是只是左右面板放置一个带有CardLayout的容器。每个容器应该有左(或右)面板和占位符(例如一个面板)。当你想要隐藏左(或右)面板时,只需交换显示空面板的卡片。

答案 1 :(得分:2)

您的解决方案无法解决,无法修复。绘画并非完全来自父组件,必要时可以自己绘制子组件(这是您所经历的)。

如果由于外部要求而无法使用其他布局管理器,则必须删除左侧面板的内容才能隐藏它们。只需将儿童包裹在另一个面板中,以便在移除面板时可以轻松存储。