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

标签 java swing layout awt

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

  • 主面板
    • 左面板
    • 右面板

展位面板的大小将是父面板的一半。 我想隐藏左侧面板,而不破坏布局。并且无需更改布局管理器(这在我的要求“BorderLayout”中以某种方式进行了硬编码)。右侧面板的大小仍应为主面板的一半。

我的解决方案: 我重写了绘画方法并添加了一个 boolean 值“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. 有人有更好的解决方案吗?

最佳答案

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

关于java - 在不破坏布局的情况下隐藏 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8133668/

相关文章:

java - 如何在不锁定 UI 的情况下从 SQLite 进行 SELECT?

html - 浏览器图像渲染中断 css 内联 block 布局

java - 如何定期从ListView中删除项目?

Java - 设置 JLabel 的宽度/高度

java - 从现有数据库或 JPA 实体生成 XSD 架构

java - 处理来自 java "unchecked conversion"的潜在运行时异常的最佳方法是什么?

java - 在 JComboBox 项中显示按钮

java - 消息框不会停止出现

java - 我可以用 Java 构建有吸引力的 GUI 吗?

安卓布局 : Can't place the elements where I want