Swing/FontChange のバックアップの現在との差分(No.16)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/FontChange へ行く。
- 1 (2006-04-16 (日) 01:31:01)
- 2 (2006-05-31 (水) 10:35:06)
- 3 (2006-09-12 (火) 16:14:39)
- 4 (2006-09-12 (火) 17:24:39)
- 5 (2007-05-16 (水) 13:59:35)
- 6 (2007-05-16 (水) 15:08:34)
- 7 (2007-12-10 (月) 20:43:41)
- 8 (2009-02-27 (金) 12:42:04)
- 9 (2009-11-03 (火) 00:08:46)
- 10 (2009-12-08 (火) 13:02:22)
- 11 (2010-11-20 (土) 06:25:08)
- 12 (2013-02-26 (火) 14:50:19)
- 13 (2013-02-26 (火) 16:10:01)
- 14 (2013-05-25 (土) 09:12:49)
- 15 (2013-05-26 (日) 00:51:21)
- 16 (2013-05-26 (日) 05:28:25)
- 17 (2013-05-26 (日) 07:09:46)
- 18 (2013-08-16 (金) 16:16:14)
- 19 (2013-08-17 (土) 15:29:42)
- 20 (2013-09-24 (火) 21:09:06)
- 21 (2014-11-01 (土) 00:46:09)
- 22 (2014-12-30 (火) 15:30:23)
- 23 (2015-01-28 (水) 15:05:15)
- 24 (2015-03-03 (火) 14:16:05)
- 25 (2015-03-07 (土) 15:37:42)
- 26 (2016-05-24 (火) 22:22:12)
- 27 (2016-05-25 (水) 13:04:44)
- 28 (2017-03-28 (火) 15:08:00)
- 29 (2017-03-30 (木) 14:05:52)
- 30 (2017-03-31 (金) 16:08:14)
- 31 (2017-04-04 (火) 14:17:08)
- 32 (2017-04-07 (金) 13:51:51)
- 33 (2017-08-15 (火) 14:38:03)
- 34 (2017-11-02 (木) 15:34:40)
- 35 (2018-08-24 (金) 13:57:50)
- 36 (2019-10-18 (金) 17:41:27)
- 37 (2021-05-20 (木) 07:49:53)
- 38 (2022-08-20 (土) 22:15:25)
- 39 (2024-02-15 (木) 20:22:19)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:UIManagerで使用するFontを統一 #navi(../) #tags(UIManager, Font) RIGHT:Posted by &author(aterai); at 2003-10-27 *UIManagerで使用するFontを統一 [#u24f3fb9] ``Swing``の各種コンポーネントで使用する全てのフォントを一気に変更します。 --- category: swing folder: FontChange title: UIManagerで使用するFontを統一 tags: [UIManager, Font] author: aterai pubdate: 2003-10-27 description: Swingの各種コンポーネントで使用する全てのフォントを一気に変更します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTNJ5XQrjI/AAAAAAAAAaU/lvxCohYLmBI/s800/FontChange.png --- * 概要 [#summary] `Swing`の各種コンポーネントで使用する全てのフォントを一気に変更します。 -&jnlp; -&jar; -&zip; #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTNJ5XQrjI/AAAAAAAAAaU/lvxCohYLmBI/s800/FontChange.png) //#screenshot #ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTNJ5XQrjI/AAAAAAAAAaU/lvxCohYLmBI/s800/FontChange.png) **サンプルコード [#o65c96e5] * サンプルコード [#sourcecode] #code(link){{ private void updateFont(final Font font) { FontUIResource fontUIResource = new FontUIResource(font); for(java.util.Map.Entry<?,?> entry: UIManager.getDefaults().entrySet()) { if(entry.getKey().toString().toLowerCase().endsWith("font")) { UIManager.put(entry.getKey(), fontUIResource); // for (Map.Entry<?, ?> entry: UIManager.getDefaults().entrySet()) { UIManager.getLookAndFeelDefaults().forEach((key, value) -> { if (key.toString().toLowerCase(Locale.ENGLISH).endsWith("font")) { UIManager.put(key, fontResource); } } //SwingUtilities.updateComponentTreeUI(this); }); // SwingUtilities.updateComponentTreeUI(this); recursiveUpdateUI(this); frame.pack(); } private void recursiveUpdateUI(JComponent p) { for(Component c: p.getComponents()) { if(c instanceof JToolBar) { for (Component c: p.getComponents()) { if (c instanceof JToolBar) { continue; }else if(c instanceof JComponent) { JComponent jc = (JComponent)c; } else if (c instanceof JComponent) { JComponent jc = (JComponent) c; jc.updateUI(); if(jc.getComponentCount()>0) recursiveUpdateUI(jc); if (jc.getComponentCount() > 0) { recursiveUpdateUI(jc); } } } } }} **解説 [#laf90233] 上記のサンプルでは、ツールバーのボタンでコンポーネントが使用するフォントを切り替えています。ただしツールバーだけは、``UI``の``update``(フォントの変更)を除外しています。 * 解説 [#explanation] 上記のサンプルでは、ツールバーのボタンでコンポーネントが使用するフォントを切り替えています。ただしツールバーだけは、`UI`の`update`(フォントの変更)を除外しています。 全部のコンポーネントではなく、例えばテーブルのフォントだけ変更したい場合は以下のように設定します。 ---- - 全コンポーネントではなく、例えば`JTable`のフォントだけ変更したい場合は`Table.font`をキーにして以下のように設定する #code{{ UIManager.put("Table.font", new FontUIResource(font)); }} ``UIManager``から、``UIDefaults``のキー一覧を作るなどして、いろいろ検索してみてください。 - 各コンポーネントのキーは、`UIManager`から`UIDefaults`のキー一覧が作成可能 #code{{ //キー一覧の作成例 import java.util.Map; // キー一覧の作成例 import javax.swing.UIManager; class Test { public static void main(String[] args) { //for(Object o:UIManager.getDefaults().keySet()) //は、うまくいかない? //for(Object o:UIManager.getLookAndFeelDefaults().keySet()) for(Map.Entry<?,?> entry: UIManager.getDefaults().entrySet()) System.out.println(entry.getKey()); UIManager.getLookAndFeelDefaults().forEach((key, value) -> System.out.println(key)); } } }} この方法は、一々[http://java.sun.com/products/jlf/ed2/book/HIG.Glossary.html#51529 LookAndFeel]を作成してフォントを変更するのが面倒なときには便利です。[http://java.sun.com/products/jlf/ed2/book/HIG.Glossary.html#51529 LookAndFeel]を自作する場合は、以下などを参考にしてみてください。 - [http://www.sun.com/access/developers/developing-accessible-apps/ Developing Accessible JFC Applications] -- [http://www.sun.com/access/developers/developing-accessible-apps/appendix.html Appendix A - LowVisionMetalLookAndFeel] - [http://www2u.biglobe.ne.jp/~kaduhiko/java_09.html 自分だけのカッコ良いアプリを作りたい,の巻] ---- ``Metal``で使用されているフォントが気に入らないといった場合は、システム``Look&Feel``を使用するか、``Metal``でボールドフォントを無効にするなどの方法があります。 - ``MetalLookAndFeel``ではなく、``SystemLookAndFeel``を使用する #code{{ try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(Exception e) { e.printStackTrace(); } }} - ``MetalLookAndFeel``で、``bold fonts``を無効にする場合 - `MetalLookAndFeel`で使用されているボールドフォントは、以下のように変更可能 -- [[MetalLookAndFeelで太字フォントを使用しない >Swing/BoldMetal]] #code{{ UIManager.put("swing.boldMetal", Boolean.FALSE); }} ---- - ``JComboBox#setFont``をしても、``JComboBox``自体のサイズが更新されない -- [http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5006246 JCombobox doesn't get resized according to font size change] - `JComboBox#setFont(...)`で使用するフォントのサイズを変更しても、`JComboBox`自体のサイズが更新されない -- [https://bugs.openjdk.org/browse/JDK-5006246 JCombobox doesn't get resized according to font size change] #code{{ combo.setFont(font); //以下回避方法 combo.setPrototypeDisplayValue(null); //null:default? //or combo.firePropertyChange("prototypeDisplayValue",0,1); //0,1:dummy // 以下回避方法 combo.setPrototypeDisplayValue(null); // null:default? // or combo.firePropertyChange("prototypeDisplayValue", 0, 1); }} ---- 特定のインスタンスだけ、``LookAndFeel``などを変更しても常に独自のフォントを設定したい場合、``JComponent#updateUI()``をオーバーライドして設定する方法もあります。 特定のインスタンスだけ、`LookAndFeel`などを変更しても常に独自のフォントを設定したい場合、`JComponent#updateUI()`をオーバーライドして設定する方法もあります。 #code{{ JLabel label = new JLabel() { @Override public void updateUI() { super.updateUI(); setFont(...); } }; }} **参考リンク [#sd5f9cb6] * 参考リンク [#reference] - [http://java-house.jp/ml/archive/j-h-b/049474.html Re: setFont に関して] **コメント [#g0e08b07] - ``JFileChooser``インスタンス化前に上記ソースを実行すると ``ConcurrentModificationException``がスローされるのですが... 「``JDK1.4.2_02``」プロパティーが動的に変化するとしたらあまり有効な方法でないのでは? -- [[MT]] &new{2003-12-24 (水) 14:22:15}; -割と手軽なので重宝するのですが、ちゃんとスレッド処理考えたほうがいいのかもしれませんね。 -- [[aterai]] &new{2003-12-25 (木) 20:06:15}; -レスありがとうございます _ _)m とりあえず ``Container`` を辿りながら含まれている ``Component`` 毎に ``setFont`` 呼ぶようなユーティリティ用意してしのいでいます^^; -- [[MT]] &new{2003-12-26 (金) 16:20:14}; - ``UIManager``のリストにないコンポーネント(独自で作成したボタンなどのコンポーネント)なども追加すると変更が適用されるのでしょうか? -- [[mari]] &new{2004-01-22 (木) 10:53:29}; - ``JBottun``などの``Swing``コンポーネントを継承していれば変更されるはずです。 -- [[aterai]] &new{2004-01-22 (木) 11:46:40}; -レスありがとうございます。その場合、独自のコンポーネントを追加すると、そのコンポーネントのみ変更が適用されますか?``Panel``を追加したら全ての``panel``に適用されてしまってうまくいきませんでした。良い方法があったら教えてください。 -- [[mari]] &new{2004-01-23 (金) 10:24:45}; -すべてのコンポーネントに一々設定するのが面倒な場合のための方法なので、上記の場合は使用する意味が無いですね(^^;。ある独自コンポーネントのみフォントを変えたいのなら、コンストラクタなどで普通に``setFont``すればいいのでないかと思うのですが、どうなんでしょう?そうじゃなくて、あるパネル以下のコンポーネントのフォントを一気に変えたいということなんでしょうか? -- [[aterai]] &new{2004-01-23 (金) 12:13:27}; -たびたびすみません。全体のフォントの大きさをツールバーの選択によって変化させるようにしたいです。フォントだけ変化させたいのですが、コンストラクタなどで勝手に``setBackground``しているコンポーネントは``Look and Feel``で設定しているデフォルトの``background``に変わってしまいました。また``new``するわけではないので、そのコンポーネントのみののデフォルトをどこかで設定できたらいいなー、と思いました。``Look and Feel``でも``panel``だったら``panel``全ての設定しかできないのでしょうか?有効な方法があったら教えてください。よろしくお願いいたします。 -- [[mari]] &new{2004-01-23 (金) 14:05:47}; -``Look and Feel``で変更するのではなく、イベントリスナーを作って実装するのはどうでしょう?はずしてるかもしれませんが、とりあえずサンプル置いておきます。初期値はコンストラクタで指定してます。ツールバーじゃなくてメニューで、フォントを切り替えてます。コンボボックスを切り替えたときにサイズがおかしいのは愛嬌ということで…。 -- [[aterai]] &new{2004-01-23 (金) 15:39:27}; --[[EventListenerを実装して独自イベント作成>Swing/EventListener]] -すばらしいサンプルありがとうございます!参考にさせていただきました☆フォントの変更を``Look and Feel``で行って、残りの描画できなかった背景色などを``PropertyChangeListenerを``実装して描画しなおす、という方法も考えたのですが、こちらでも問題ないでしょうか?主題から外れてしまって申し訳ありません・・・。 -- [[mari]] &new{2004-01-26 (月) 09:56:38}; -次のネタ用にイベント作っただけなので、``PropertyChangeListener``使うのはまったく問題ないと思います。むしろちゃんと``JavaBeans``にして``PropertyChangeListener``使うほうがいいかもしれません(^^;。 -- [[aterai]] &new{2004-01-26 (月) 12:54:00}; - updateUI()をオーバーライドする方法を追記。 -- [[aterai]] &new{2013-02-26 (火) 16:15:09}; - nimbus の場合は、この方法では駄目でした。バグのようです。回避策は、``UIManager.getLookAndFeelDefaults().put("defaultFont", new Font(Font.SANS_SERIF, 0, 20));``をフレームをnewする前に実行する事でした。 参考URL:http://stackoverflow.com/questions/949353/java-altering-ui-fonts-nimbus-doesnt-work -- [[匿名]] &new{2013-05-25 (土) 09:14:08}; -- 情報ありがとうございます。これバグだとすると修正されるのかな?(仕様になりそうな気がしますが) 参考URLにあるjasperpotts.comの``Nimbus Defaults``一覧が便利ですね(チュートリアル[http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)]にも転載されています)。このサイトでは、そちらを参考にして``NimbusLookAndFeel``の色をまとめて変換するサンプル([[NimbusLookAndFeelのカラーパレット>Swing/NimbusColorPalette]])を作成しています。 -- [[aterai]] &new{2013-05-26 (日) 00:51:21}; * コメント [#comment] #comment - `JFileChooser`インスタンス化前に上記ソースを実行すると `ConcurrentModificationException`がスローされるのですが... 「`JDK1.4.2_02`」プロパティーが動的に変化するとしたらあまり有効な方法でないのでは? -- &user(MT); &new{2003-12-24 (水) 14:22:15}; -割と手軽なので重宝するのですが、ちゃんとスレッド処理考えたほうがいいのかもしれませんね。 -- &user(aterai); &new{2003-12-25 (木) 20:06:15}; -レスありがとうございます _ _)m とりあえず `Container` を辿りながら含まれている `Component` 毎に `setFont` 呼ぶようなユーティリティ用意してしのいでいます^^; -- &user(MT); &new{2003-12-26 (金) 16:20:14}; - `UIManager`のリストにないコンポーネント(独自で作成したボタンなどのコンポーネント)なども追加すると変更が適用されるのでしょうか? -- &user(mari); &new{2004-01-22 (木) 10:53:29}; - `JButton`などの`Swing`コンポーネントを継承していれば変更されるはずです。 -- &user(aterai); &new{2004-01-22 (木) 11:46:40}; -レスありがとうございます。その場合、独自のコンポーネントを追加すると、そのコンポーネントのみ変更が適用されますか?`Panel`を追加したら全ての`panel`に適用されてしまってうまくいきませんでした。良い方法があれば教えてください。 -- &user(mari); &new{2004-01-23 (金) 10:24:45}; -すべてのコンポーネントに一々設定するのが面倒な場合のための方法なので、上記の場合は使用する意味が無いですね(^^;。ある独自コンポーネントのみフォントを変えたいのなら、コンストラクタなどで普通に`setFont`すればいいのでないかと思うのですが、どうなんでしょう?そうではなく、あるパネル以下のコンポーネントのフォントを一気に変えたいということなんでしょうか? -- &user(aterai); &new{2004-01-23 (金) 12:13:27}; -たびたびすみません。全体のフォントの大きさをツールバーの選択によって変化させるようにしたいです。フォントだけ変化させたいのですが、コンストラクタなどで勝手に`setBackground`しているコンポーネントは`Look and Feel`で設定しているデフォルトの`background`に変わってしまいました。また`new`するわけではないので、そのコンポーネントのみのデフォルトをどこかで設定できたらいいなー、と思いました。`Look and Feel`でも`panel`だったら`panel`全ての設定しかできないのでしょうか?有効な方法があれば教えてください。よろしくお願いいたします。 -- &user(mari); &new{2004-01-23 (金) 14:05:47}; -`Look and Feel`で変更するのではなく、イベントリスナーを作って実装するのはどうでしょう?はずしてるかもしれませんが、とりあえずサンプル置いておきます。初期値はコンストラクタで指定してます。ツールバーじゃなくてメニューで、フォントを切り替えてます。コンボボックスを切り替えたときにサイズがおかしいのは愛嬌ということで…。 -- &user(aterai); &new{2004-01-23 (金) 15:39:27}; -- [[EventListenerを実装して独自イベント作成>Swing/EventListener]] -すばらしいサンプルありがとうございます!参考にさせていただきました☆フォントの変更を`Look and Feel`で行って、残りの描画できなかった背景色などを`PropertyChangeListener`を実装して描画しなおす、という方法も考えたのですが、こちらでも問題ないでしょうか?主題から外れてしまって申し訳ありません・・・。 -- &user(mari); &new{2004-01-26 (月) 09:56:38}; -次のネタ用にイベント作っただけなので、`PropertyChangeListener`使うのはまったく問題ないと思います。むしろちゃんと`JavaBeans`にして`PropertyChangeListener`使うほうがいいかもしれません(^^;。 -- &user(aterai); &new{2004-01-26 (月) 12:54:00}; - `updateUI()`をオーバーライドする方法を追記。 -- &user(aterai); &new{2013-02-26 (火) 16:15:09}; - `Nimbus`の場合は、この方法では駄目でした。バグのようです。回避策は、`UIManager.getLookAndFeelDefaults().put("defaultFont", new Font(Font.SANS_SERIF, 0, 20));`をフレームを`new`する前に実行する事でした。 参考:[https://stackoverflow.com/questions/949353/java-altering-ui-fonts-nimbus-doesnt-work swing - Java: Altering UI fonts (Nimbus) doesn't work! - Stack Overflow] -- &user(匿名); &new{2013-05-25 (土) 09:14:08}; -- 情報ありがとうございます。これバグだとすると修正されるのかな?(仕様になりそうな気がしますが) 参考のリンク先にある[http://jasperpotts.com/blogfiles/nimbusdefaults/nimbus.html Nimbus Defaults]一覧が便利ですね(チュートリアル[https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)]にも転載されています)。このサイトでは、そちらを参考にして`NimbusLookAndFeel`の色をまとめて変換するサンプル([[NimbusLookAndFeelのカラーパレット>Swing/NimbusColorPalette]])を作成しています。 -- &user(aterai); &new{2013-05-26 (日) 00:51:21}; #comment