• category: swing folder: LookAndFeelChangeListener title: LookAndFeelの変更を取得する tags: [LookAndFeel, UIManager, PropertyChangeListener, JComponent] author: aterai pubdate: 2014-06-23T01:04:57+09:00 description: LookAndFeelの変更を取得するリスナーの作成などを行います。 image: https://lh3.googleusercontent.com/-dbduLE1mbyM/U6b3UwtJj6I/AAAAAAAACH4/AUy3dSpgxMg/s800/LookAndFeelChangeListener.png

概要

LookAndFeelの変更を取得するリスナーの作成などを行います。

サンプルコード

UIManager.addPropertyChangeListener(new PropertyChangeListener() {
  @Override public void propertyChange(PropertyChangeEvent e) {
    if (e.getPropertyName().equals("lookAndFeel")) {
      // String lnf = e.getNewValue().toString();
      updateCheckBox("UIManager: propertyChange");
    }
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、以下の3種類の方法でLookAndFeelの変更を取得するテストを行っています。

  • UIManager: propertyChange
    • UIManager.addPropertyChangeListener(PropertyChangeListener)を使用してLookAndFeelの変更を取得
    • このサンプルでは、初回のUIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())の実行後にPropertyChangeListenerを設定しているためそれには反応しない
  • JPanel: updateUI
    • LookAndFeelの変更(SwingUtilities.updateComponentTreeUI(...)が実行)されると必ず呼び出されるJComponent.updateUI()をオーバーライドして変更を取得
    • このメソッドをオーバーライドしたコンポーネントのコンストラクタが実行される前に呼び出される場合があるので、子コンポーネントの更新はEventQueue.invokeLater(...)を使って一連のUIイベントの一番最後に実行する
  • JMenuItem: actionPerformed
    • このサンプルでは、JRadioButtonMenuItemLookAndFeelを切り替えているので各ボタンにActionListenerを追加し、チェックされた時にLookAndFeelの変更を取得している
    • アクションが実行された時点ではLookAndFeelの変更が完了しておらずUIManagerのプロパティ値も前のLookAndFeelのままなので、その値の取得はEventQueue.invokeLater(...)を使って一連のUIイベントの一番最後に実行する

参考リンク

コメント