2013-07-31 56 views
1

我有一個允許用戶調整顏色的JFrame。使用反射將這些顏色設置爲類Colors的靜態字段。這裏是Colors類:如何重新繪製Java Swing應用程序的所有可見組件?

public class Colors { 

    public static Color TextBackground = Color.black; 
    public static Color TextForeground = Color.white; 
} 

還有許多其他的部件,位於幾個Jframe的,他們Colors類的所有應用領域。當我手動使它們重新繪製(例如通過調整大小)時,它們都會正確重繪。

但是,如何讓所有其他組件自動重繪?

我試過的東西,似乎髒改變的LookAndFeel,但沒有奏效:

UIManager.setLookAndFeel(UIManager.getLookAndFeel()); 

更新:我需要重繪組件中的所有其他 Jframe的,當前可見。

+0

_they都使用Colors類的字段_什麼是可怕的設計...你是什麼意思_automatically_?在幀列表中循環並重新繪製它們是更改字段後需要執行的最小操作。 – kleopatra

回答

0

這將重繪所有業主的窗戶少

Window[] windows = Frame.getOwnerlessWindows(); 
for (int i = 0; i < windows.length; i++) { 
    windows[i].repaint(); 
} 
2

您需要在JFrame上調用一個方法,以告知它在更改顏色時需要重新繪製其內容。我相信正確的方法是revalidate(),但repaint()也可以。對於在Swing繪畫更多信息,嘗試尋找這裏:

http://www.oracle.com/technetwork/java/painting-140037.html

+0

謝謝,但這不是我問的。請參閱更新中的說明。 – Serg

+0

在這種情況下,可能會維護所有JFrame的集合,並且在更改顏色時,遍歷列表並讓每個JFrame重繪? – NinjaBlob

1

有一個類擴展JPanel並重寫 公共無效的paintComponent功能。

當你調用frame.repaint()時,它會引用paintComponent中的代碼。

2

聽起來像你沒有一個好的句柄,哪些組件可能在那裏使用Colors類。在這種情況下,我會給Colors支持PropertyChangeListener的能力。

class Colors { 

    private static Colors instance = new Colors(); 

    public static Colors getInstance() { 
    return instance; 
    } 

    private Color textBackground = Color.black; 

    private PropertyChangeSupport backgroundProp = new PropertyChangeSupport(textBackground); 

    public void setBackgroundColor(Color color) { 
    this.textBackground = color; 
    } 

    public void addBackgroundListener(PropertyChangeListener listener) { 
    backgroundProp.addPropertyChangeListener(listener); 
    } 
} 

然後,每當一個組件使用Colors它定義爲一個PropertyChangeListener,讓Colors知道這件事。

class MyTextField extends JTextField implements PropertyChangeListener { 

    public MyTextField() { 
    super(); 
    Colors.getInstance().addBackgroundListener(this); 
    } 

    public void propertyChange(PropertyChangeEvent evt) { 
    Color background = (Color)evt.getNewValue(); 
    setBackground(background); 
    repaint(); 
    } 
} 
1

這個顏色設置成使用反射類顏色的靜態字段。

這是你的問題。而不是a)將顏色存儲在靜態變量中,b)使用反射來更新這些值,或者c)在無主窗口的數組上循環,按設計使用Swing。這是一個更多的代碼,但它會更乾淨,更有效地做你想做的事情。

  1. 請勿使用反射。爲用戶創建一個實際的界面,以實例更新顏色值,而不是靜態,並將其與用戶將使用的框架綁定,以指定他們想要的顏色。

  2. 在ColorManager對象上放置接受ChangeListener對象的方法。至少,只需在addChangeListener()方法中創建,但也可以通過定義幾種方法來添加更細化的控制,例如addBackgroundListener(),addForegroundListener()等。這些方法應存儲已註冊偵聽器的列表,這些方法將在關聯操作(用戶更新顏色)被執行。

  3. 使您的Windows實現ChangeListener接口,並將其註冊到ColorManager對象。當調用stateChanged()方法時,Windows可以處理它,更新顏色並在同一位置調用repaint()

這裏的關鍵優勢在於,現在每個班級都在按照自己的想法做事,並且對其他班級沒有意想不到的副作用。 ColorManager直接(而不是通過反射)由用戶更新,它精確地通知明確要求通知的對象(如果這是你想要的,它仍然可以是所有的窗口),並且那些對象可以用信息他們需要什麼,無論是重新繪畫還是做更復雜的事情。