2011-11-15 53 views
1

我确实有我放置3个板像隐藏的JPanel没有打破布局

  • 主面板
    • 左图
    • 右侧面板

展位屏幕面板将有父面板大小的一半。 我想隐藏左侧面板,而不会破坏布局。并且不需要修改布局管理器(这在我的需求'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(); 
     } 
    } 
} 

几乎一切工作,但我有一个刷新问题durign

我加2个按钮在屏幕下面的测试用例。一个用于改变可见性状态,另一个用于隐藏状态。

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

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

如果您有布局问题,请在布局领域解决它_not_在绘制代码。为什么不能使用适合您需求的LayoutManager? – kleopatra

回答

3

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

+0

thansk很多,CardLayout对我来说是新的。这是我寻找的解决方案。 –

2

您的解决方案不可行,无法修复。绘画并不完全来源于父组件,如果有必要,子组件可以自行绘制(这就是您所体验的内容)。

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

+0

我想,布局是硬编码的,但我想通了,我可以使用我的用例的解决方法。 –

+0

如果你想了解新的布局,看看Miglayout,那是(IMO)最灵活的布局管理器。 –