2015-01-05 75 views
0

我想創建一個帶有許多JPanel和部分文本,所有這些都有默認顏色(面板有白色背景,文本是黑色)的JFrame。我希望允許用戶在運行時動態更改這些內容,因此我實現了一個JColorChooser對話框,在該對話框中可以單擊按鈕,顯示對話框,然後從中保存顏色。更改組件的背景顏色參考顏色變量java

我的默認顏色設置在實例變量,像這樣:

private Color panelColor; 
private Color textColor; 

要設置我的面板的背景顏色,我用:

JPanel samplePanel = new JPanel(); 
samplePanel.setBackground(panelColor); //panelColor has already been instantiated 

這工作得很好,使得面板白色。但是,當我嘗試使用JColorChooser加載新的Color以供使用時,面板不會更改。選擇我一個顏色後使用的代碼是:

if(newColor != null) 
{ 
    panelColor = newColor; 
    myFrame.repaint(); 
} 

我所有的組件是一個JFrame的裏面,我還以爲調用重繪()上的JFrame將依次調用paintChildren()和級聯一路降到最低水平。

我相信我的問題在於我瞭解如何在Java中處理對象。我知道對象是通過引用傳遞的,但我也假設當我設置組件的背景顏色時,這是通過傳遞參考方案實現的,我開始懷疑它。當我調用setBackground()時,通過傳遞值傳遞的Color參數是否作爲副本結束?

如果我的預感是正確的,這是否意味着我應該寫一個方法,它包含所有需要更改背景的組件,並調用每個組件的setBackground(),將Color變量傳遞給新值?

乾杯

+0

是的,你可能需要在每個對象上調用'setBackground()'。或者使用透明(非不透明)組件,只設置其父面板的背景,但透明度可能會非常棘手。有些物體依靠不透明來正確擦除視口。 – markspace

+0

嗯,在這種情況下,似乎最好調用每個組件的setBackground(),即使它需要一段時間。我會避免與透明度解決方案混淆,我有一個相當繁忙的用戶界面,所以很可能我很快就會搞砸了。 – Stevo

回答

1

由於,使用的setBackground()時,顏色對象被傳遞按值的色差,作爲markspace建議的事實,每個部件將有稱爲它的個體的方法。

使用Dan O在此線程中提供的代碼的修改版本:Iterate through all objects in Jframe, 我想出了一個解決方案,它允許修改JFrame(或任何容器)中的每個JPanel。這是一個遞歸的解決方案,所以任何嵌套的Container實例也會讓他們的子代遍歷。

public void setPanelColor(Container parent) 
{ 
    for(Component c : parent.getComponents()) 
    { 
     if(c instanceof Container) 
     { 
      if(c instanceof JPanel) 
      { 
       c.setBackground(panelColor); 
      } 

      setPanelColor((Container)c); 
     } 
    } 
} 

由於我使用一個實例變量(panelColor)持有的顏色,我可以從方法中引用它,但你可以把它在很容易地通過作爲傳遞的名稱參數和替代panelColor在Color變量中。