• 追加された行はこの色です。
  • 削除された行はこの色です。
---
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
---
* 概要 [#summary]
`LookAndFeel`の変更を取得するリスナーの作成などを行います。

#download(https://lh3.googleusercontent.com/-dbduLE1mbyM/U6b3UwtJj6I/AAAAAAAACH4/AUy3dSpgxMg/s800/LookAndFeelChangeListener.png)

* サンプルコード [#sourcecode]
#code(link){{
UIManager.addPropertyChangeListener(new PropertyChangeListener() {
  @Override public void propertyChange(PropertyChangeEvent e) {
    if (e.getPropertyName().equals("lookAndFeel")) {
      //String lnf = e.getNewValue().toString();
      // String lnf = e.getNewValue().toString();
      updateCheckBox("UIManager: propertyChange");
    }
  }
});
}}

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

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

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/UIManager.html#addPropertyChangeListener-java.beans.PropertyChangeListener- UIManager#addPropertyChangeListener(...) (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment