• category: swing folder: SynthLookAndFeel title: SynthのスタイルをXMLファイルで設定する tags: [SynthLookAndFeel, LookAndFeel] author: aterai pubdate: 2018-08-13T14:59:12+09:00 description: SynthLookAndFeelのスタイルをXMLファイルで設定します。 image: https://drive.google.com/uc?id=1yPNRdiUSVu_8dPLvMFdctKzE9Tnp-hSXDA

概要

SynthLookAndFeelのスタイルをXMLファイルで設定します。

サンプルコード

Class<?> clz = MainPanel.class;
try (InputStream is = clz.getResourceAsStream("button.xml")) {
  SynthLookAndFeel synth = new SynthLookAndFeel();
  synth.load(is, clz);
  UIManager.setLookAndFeel(synth);
} catch (IOException | ParseException | UnsupportedLookAndFeelException ex) {
  ex.printStackTrace();
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、以下のようなXMLファイルでSynthLookAndFeelのスタイルを設定しています。

<synth>
  <style id="default">
    <font name="Dialog" size="16" /> 
  </style>
  <bind style="default" type="region" key=".*" />
  <style id="ButtonTest">
    <opaque value="true" />
    <insets top="10" bottom="10" left="10" right="10" />
    <state>
      <font name="Verdana" size="24" />
      <color type="BACKGROUND" value="#FF0000" />
      <color type="TEXT_FOREGROUND" value="#000000" />
    </state>
    <state value="MOUSE_OVER">
      <color type="BACKGROUND" value="ORANGE" />
      <color type="TEXT_FOREGROUND" value="WHITE" />
    </state>
    <state value="PRESSED">
      <color type="BACKGROUND" value="BLUE" />
      <color type="TEXT_FOREGROUND" value="WHITE" />
    </state>
  </style>
  <bind style="ButtonTest" type="region" key="button" />

  <style id="greenButton">
    <opaque value="true" />
    <insets top="10" bottom="10" left="10" right="10" />
    <state>
      <font name="Verdana" size="24" />
      <color type="BACKGROUND" value="GREEN" />
      <color type="TEXT_FOREGROUND" value="#000000" />
    </state>
    <state value="MOUSE_OVER">
      <color type="BACKGROUND" value="RED" />
      <color type="TEXT_FOREGROUND" value="WHITE" />
    </state>
    <state value="PRESSED">
      <color type="BACKGROUND" value="BLUE" />
      <color type="TEXT_FOREGROUND" value="WHITE" />
    </state>
  </style>
  <bind style="greenButton" type="name" key="green:[0-9]+" />
</synth>
  • SynthXMLファイルの詳細(DTDなど)は、Synthのファイル形式で参照可能
  • 特定のコンポーネントにスタイルを設定する場合は、bind要素のtype属性にkeyではなくnameを設定してkey属性に対象コンポーネントにComponent#setName(...)で設定された名前を正規表現で指定する
    • 例: <bind style="greenButton" type="name" key="green:[0-9]+" />で名前がbutton3.setName("green:3");のような形式になっているコンポーネントにgreenButtonスタイルが適用される
    • 進歩したSynth - IBM developerWorksについて
      • 「非Swingコンポーネントをペイントする」でbind要素のtype属性にkeyではなくnameを設定した場合の説明があるが、Java 8のソースコード(javax/swing/plaf/synth/DefaultSynthStyleFactory#getMatchingStyles(...))を確認した限りではコンポーネントのクラス名を対象にする機能は存在しない(1.4では可能だった?のかもしれない)

        <bind>タグを<bind style="mystyle" type="name" key="Custom.*"/>に変更すると、mystyleスタイルを使うためには、クラス名がCustomで始まる全コンポーネント(例えばCustomTextFieldCustomLabelなど)を変更することになります。

参考リンク

コメント