Swing/SynthLookAndFeel の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/SynthLookAndFeel へ行く。
- Swing/SynthLookAndFeel の差分を削除
--- 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 --- * 概要 [#summary] `SynthLookAndFeel`のスタイルを`XML`ファイルで設定します。 #download(https://drive.google.com/uc?id=1yPNRdiUSVu_8dPLvMFdctKzE9Tnp-hSXDA) * サンプルコード [#sourcecode] #code(link){{ 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(); } }} * 解説 [#explanation] 上記のサンプルでは、以下のような`XML`ファイルで`SynthLookAndFeel`のスタイルを設定しています。 #code{{ <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> }} - `Synth`の`XML`ファイルの詳細(`DTD`など)は[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/plaf/synth/doc-files/synthFileFormat.html Synthのファイル形式]で参照可能 - 特定のコンポーネントにスタイルを設定する場合は、`bind`要素の`type`属性に`key`ではなく`name`を設定して`key`属性に対象コンポーネントに`Component#setName(...)`で設定された名前を正規表現で指定する -- 例: `<bind style="greenButton" type="name" key="green:[0-9]+" />`で名前が`button3.setName("green:3");`のような形式になっているコンポーネントに`greenButton`スタイルが適用される -- [https://www.ibm.com/developerworks/jp/java/library/j-synth/index.html 進歩したSynth - IBM developerWorks]について --- 「非`Swing`コンポーネントをペイントする」で`bind`要素の`type`属性に`key`ではなく`name`を設定した場合の説明があるが、`Java 8`のソースコード(`javax/swing/plaf/synth/DefaultSynthStyleFactory#getMatchingStyles(...)`)を確認した限りではコンポーネントのクラス名を対象にする機能は存在しない(`1.4`では可能だった?のかもしれない) #code{{ `<bind>`タグを`<bind style="mystyle" type="name" key="Custom.*"/>`に変更すると、`mystyle`スタイルを使うためには、クラス名が`Custom`で始まる全コンポーネント(例えば`CustomTextField`や`CustomLabel`など)を変更することになります。 }} --- 「非`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`で始まる全コンポーネント(例えば`CustomTextField`や`CustomLabel`など)を変更することになります。 * 参考リンク [#reference] - [https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html The Synth Look and Feel (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)] - [https://www.ibm.com/developerworks/jp/java/library/j-synth/index.html 進歩したSynth] -- 現在は無効になっている「`<bind>`要素のクラス名関係」以外は正確で有用と思われる * コメント [#comment] #comment #comment