Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 隐藏JPanel而不破坏布局_Java_Swing_Layout_Awt - Fatal编程技术网

Java 隐藏JPanel而不破坏布局

Java 隐藏JPanel而不破坏布局,java,swing,layout,awt,Java,Swing,Layout,Awt,我确实有一个屏幕,其中我放置了3个面板,如 主面板 左面板 右面板 展台面板的尺寸为母面板尺寸的一半。 我想在不破坏布局的情况下隐藏左侧面板。在不更改布局管理器的情况下(这在我的需求“BorderLayout”中以某种方式硬编码)。右侧面板的大小仍应为主面板的一半 我的解决方案: 我重写了paint方法并添加了一个布尔值“propHideContents” @Override public void paintComponents(Graphics g) { if (propHi

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

  • 主面板
    • 左面板
    • 右面板
展台面板的尺寸为母面板尺寸的一半。 我想在不破坏布局的情况下隐藏左侧面板。在不更改布局管理器的情况下(这在我的需求“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();
        }
    }
}
几乎所有的东西都在工作,但是在下面的测试用例中我确实遇到了刷新问题

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

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

  • 我怎么处理这些案子
  • 有人有更好的解决方案吗

  • 您的解决方案不可行,无法修复。绘制并不完全源于父组件,如果需要,可以单独绘制子组件(这是您的体验)


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

    您的解决方案不可行,无法修复。绘制并不完全源于父组件,如果需要,可以单独绘制子组件(这是您的体验)


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

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

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

    如果您有布局问题,请在布局领域而不是在绘制代码中解决。为什么不能使用适合您需要的布局管理器?如果您有布局问题,请在布局领域而不是在绘制代码中解决。为什么你不能使用一个适合你需要的布局管理器呢?很多时候,卡片布局对我来说是新的。这是我寻找的解决方案。很多时候,卡片布局对我来说是新的。这就是我寻找的解决方案。我想,布局是硬编码的,但我发现,我可以为我的用例使用一个变通方法。如果你想了解新的布局,看看Miglayout,这是(IMO)最灵活的布局管理器。我想,布局是硬编码的,但我发现,如果你想了解新的布局,看看Miglayout,它是(IMO)最灵活的布局管理器。