2011-11-15 112 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)最靈活的佈局管理器。 –