1

ユーザーが色を調整できる 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 のコンポーネントを再描画する必要があります。

4

5 に答える 5

2

Colorsクラスを使用してどのコンポーネントが存在する可能性があるかをよく把握していないようです。この場合、sColorsをサポートする機能を提供し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();
  }
}
于 2013-08-01T09:18:41.570 に答える
2

JFrame でメソッドを呼び出して、色を変更したときにコンテンツを再描画する必要があることを知らせる必要があります。正しい方法は だと思いますがrevalidate()repaint()うまくいくかもしれません。Swing でのペイントの詳細については、次を参照してください。

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

于 2013-07-31T20:03:40.043 に答える
1

これにより、すべての所有者のないウィンドウが再描画されます

Window[] windows = Frame.getOwnerlessWindows();
for (int i = 0; i < windows.length; i++) {
    windows[i].repaint();
}
于 2013-08-28T18:29:57.700 に答える
1

クラスで JPanel を拡張し、public void paintComponent 関数をオーバーライドします。

frame.repaint() を呼び出すと、paintComponent 内のコードが参照されます。

于 2013-07-31T20:04:07.130 に答える