• title: LookAndFeelの変更を取得する tags: [LookAndFeel, UIManager, PropertyChangeListener, JComponent] author: aterai pubdate: 2014-06-23T01:04:57+09:00 description: LookAndFeelの変更を取得するリスナーの作成などを行います。

概要

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

解説

上記のサンプルでは、以下の三種類の方法で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イベントの一番最後に実行

コメント