• category: swing folder: RendererUseListColors title: NimbusLookAndFeelでセル選択色をJListから取得するよう変更する tags: [NimbusLookAndFeel, JList, JComboBox, UIManager, LookAndFeel] author: aterai pubdate: 2022-04-11T04:12:31+09:00 description: NimbusLookAndFeelでセル選択色をUIDefaultsで設定された色ではなくJListから取得するよう変更します。 image: https://drive.google.com/uc?id=18L0O-5XjxIFGLpTCKDqLk4voZpSmNMoc

概要

NimbusLookAndFeelでセル選択色をUIDefaultsで設定された色ではなくJListから取得するよう変更します。

サンプルコード

String[] model = {"Red", "Green", "Blue"};
JList<String> list = new JList<>(model);
UIDefaults d = new UIDefaults();
d.put("List.rendererUseListColors", true);
String key = "Nimbus.Overrides";
list.putClientProperty(key, d);
View in GitHub: Java, Kotlin

解説

  • List.rendererUseListColors
    • この設定のデフォルトはfalse(左)でNimbusLookAndFeelでのみ有効
    • true(右)に設定するとUIDefaultsではなくJList#getSelectionBackground()JList#getSelectionForeground()で取得される色でセル選択を描画する
  • ComboBox.rendererUseListColors
    • ComboBox.rendererUseListColors: true
      • ComboBox.rendererUseListColorstureに設定するとJComboBoxのドロップダウンリスト内に配置されるJListが使用するNimbusLookAndFeelのデフォルトセルレンダラーであるSynthComboBoxRendererJList#getSelectionBackground()JList#getSelectionForeground()で取得される色でセルを描画する
      • ComboBox.rendererUseListColorstureに設定するとセル背景色が描画されなくなるため設定する意味がない?
    • DefaultListCellRenderer
      • JComboBoxDefaultListCellRendererを設定するとUIDefaultsではなくJList#getSelectionBackground()JList#getSelectionForeground()で取得される色でセル選択を描画する
    • BasicComboBoxRenderer
      • DefaultListCellRendererではなくBasicComboBoxRendererを使用するとセル背景色が描画されない?
    • SynthComboBoxRenderer + ListCellRenderer
      • SynthComboBoxRendererを使用してデフォルトのUIDefaultsから取得した色でセルを描画する
      • ComboBox.rendererUseListColorstureに設定している別JComboBoxが存在するとLookAndFeelを変更したときにその値が影響してしまうバグ?があるため、JComboBox#updateUI()をオーバーライドして常にComboBox.rendererUseListColorsfalseに再設定している
      • List.rendererUseListColorsLookAndFeelを変更しても他のJListの設定が影響したりしない

参考リンク

コメント