簡體   English   中英

如何重繪Java Swing應用程序的所有可見組件?

[英]How to repaint ALL visible components of Java Swing application?

我有一個JFrame,它允許用戶調整顏色。 使用反射將此顏色設置為Colors類的靜態字段。 這是Colors類:

public class Colors {

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

還有許多其他組件,位於幾個JFrame中,並且它們都使用Colors類的字段。 當我手動使它們重新繪制(例如,通過調整大小)時,它們都正確地重新繪制。

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

我嘗試了一些看起來很臟的更改LookAndFeel的方法,但沒有成功:

 UIManager.setLookAndFeel(UIManager.getLookAndFeel());

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

您需要在JFrame上調用一個方法,以使它知道更改顏色時需要重繪其內容。 我相信正確的方法是revalidate() ,但是repaint()可能也可以工作。 有關在Swing中繪畫的更多信息,請嘗試在此處查看:

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

聽起來您可能無法使用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();
  }
}

讓一個類擴展JPanel並重寫公共void paintComponent函數。

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

這將重新粉刷所有無所有者的窗口

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

使用反射將此顏色設置為Colors類的靜態字段。

這是你的問題。 與其將a)將顏色存儲在靜態變量中,要么b)使用反射來更新這些值,或者c)在無主窗口的數組上循環,請使用Swing。 這是一些代碼,但是它將更干凈,更有效地執行您想要的操作。

  1. 不要使用反射。 創建一個實際的界面供用戶更新實例而不是靜態的顏色值,並將其綁定到用戶將使用的框架中以指定所需的顏色。

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

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

這里的主要優點是,現在每個類都在按預期的方式運行,而對其他類沒有任何意外的副作用。 ColorManager由用戶直接更新(而不是通過反射),它准確地通知明確要求通知的對象(如果您要的話,仍然可以是所有窗口),並且這些對象可以使用知道他們需要什么,無論是重新粉刷還是做更復雜的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM