Swing/FontChange のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 40 (2025-01-03 (金) 08:57:02)
- 41 (2025-01-03 (金) 09:01:23)
- 42 (2025-01-03 (金) 09:02:38)
- 43 (2025-01-03 (金) 09:03:21)
- 44 (2025-01-03 (金) 09:04:02)
- 45 (2025-06-19 (木) 12:41:37)
- 46 (2025-06-19 (木) 12:43:47)
TITLE:UIManagerで使用するFontを統一
Posted by aterai at 2003-10-27
UIManagerで使用するFontを統一
`Swing
`の各種コンポーネントで使用する全てのフォントを一気に変更します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
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);
}
}
//SwingUtilities.updateComponentTreeUI(this);
recursiveUpdateUI(this);
frame.pack();
}
private void recursiveUpdateUI(JComponent p) {
for(Component c: p.getComponents()) {
if(c instanceof JToolBar) {
continue;
}else if(c instanceof JComponent) {
JComponent jc = (JComponent)c;
jc.updateUI();
if(jc.getComponentCount()>0) recursiveUpdateUI(jc);
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、ツールバーのボタンでコンポーネントが使用するフォントを切り替えています。ただしツールバーだけは、`UI
の
update
`(フォントの変更)を除外しています。
全部のコンポーネントではなく、例えばテーブルのフォントだけ変更したい場合は以下のように設定します。
UIManager.put("Table.font", new FontUIResource(font));
`UIManager
から、
UIDefaults
`のキー一覧を作るなどして、いろいろ検索してみてください。
//キー一覧の作成例
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());
}
}
この方法は、一々LookAndFeelを作成してフォントを変更するのが面倒なときには便利です。LookAndFeelを自作する場合は、以下などを参考にしてみてください。
`Metal
で使用されているフォントが気に入らないといった場合は、システム
Look&Feel
を使用するか、
Metal
`でボールドフォントを無効にするなどの方法があります。
- `
MetalLookAndFeel
ではなく、
SystemLookAndFeel
`を使用する
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exception e) {
e.printStackTrace();
}
- `
MetalLookAndFeel
で、
bold fonts
`を無効にする場合
UIManager.put("swing.boldMetal", Boolean.FALSE);
- `
JComboBox#setFont
をしても、
JComboBox
`自体のサイズが更新されない
combo.setFont(font);
//以下回避方法
combo.setPrototypeDisplayValue(null); //null:default?
//or combo.firePropertyChange("prototypeDisplayValue",0,1); //0,1:dummy
特定のインスタンスだけ、`LookAndFeel
などを変更しても常に独自のフォントを設定したい場合、
JComponent#updateUI()
`をオーバーライドして設定する方法もあります。
JLabel label = new JLabel() {
@Override public void updateUI() {
super.updateUI();
setFont(...);
}
};
参考リンク
コメント
- `
JFileChooser
インスタンス化前に上記ソースを実行すると
ConcurrentModificationException
がスローされるのですが... 「
JDK1.4.2_02
`」プロパティーが動的に変化するとしたらあまり有効な方法でないのでは? -- MT? - 割と手軽なので重宝するのですが、ちゃんとスレッド処理考えたほうがいいのかもしれませんね。 -- aterai
- レスありがとうございます _ _)m とりあえず `
Container
を辿りながら含まれている
Component
毎に
setFont
` 呼ぶようなユーティリティ用意してしのいでいます^^; -- MT? - `
UIManager
`のリストにないコンポーネント(独自で作成したボタンなどのコンポーネント)なども追加すると変更が適用されるのでしょうか? -- mari? - `
JBottun
などの
Swing
`コンポーネントを継承していれば変更されるはずです。 -- aterai - レスありがとうございます。その場合、独自のコンポーネントを追加すると、そのコンポーネントのみ変更が適用されますか?`
Panel
を追加したら全ての
panel
`に適用されてしまってうまくいきませんでした。良い方法があったら教えてください。 -- mari? - すべてのコンポーネントに一々設定するのが面倒な場合のための方法なので、上記の場合は使用する意味が無いですね(^^;。ある独自コンポーネントのみフォントを変えたいのなら、コンストラクタなどで普通に`
setFont
`すればいいのでないかと思うのですが、どうなんでしょう?そうじゃなくて、あるパネル以下のコンポーネントのフォントを一気に変えたいということなんでしょうか? -- aterai - たびたびすみません。全体のフォントの大きさをツールバーの選択によって変化させるようにしたいです。フォントだけ変化させたいのですが、コンストラクタなどで勝手に`
setBackground
しているコンポーネントは
Look and Feel
で設定しているデフォルトの
background
に変わってしまいました。また
new
するわけではないので、そのコンポーネントのみののデフォルトをどこかで設定できたらいいなー、と思いました。
Look and Feel
でも
panel
だったら
panel
`全ての設定しかできないのでしょうか?有効な方法があったら教えてください。よろしくお願いいたします。 -- mari? - `
Look and Feel
`で変更するのではなく、イベントリスナーを作って実装するのはどうでしょう?はずしてるかもしれませんが、とりあえずサンプル置いておきます。初期値はコンストラクタで指定してます。ツールバーじゃなくてメニューで、フォントを切り替えてます。コンボボックスを切り替えたときにサイズがおかしいのは愛嬌ということで…。 -- aterai - すばらしいサンプルありがとうございます!参考にさせていただきました☆フォントの変更を`
Look and Feel
で行って、残りの描画できなかった背景色などを
PropertyChangeListenerを
`実装して描画しなおす、という方法も考えたのですが、こちらでも問題ないでしょうか?主題から外れてしまって申し訳ありません・・・。 -- mari? - 次のネタ用にイベント作っただけなので、`
PropertyChangeListener
使うのはまったく問題ないと思います。むしろちゃんと
JavaBeans
にして
PropertyChangeListener
`使うほうがいいかもしれません(^^;。 -- aterai - updateUI()をオーバーライドする方法を追記。 -- aterai