TITLE:UIManagerで使用するFontを統一

UIManagerで使用するFontを統一

編集者:Terai Atsuhiro~

作成日:2003-10-01
更新日:2024-02-15 (木) 20:22:19
  • 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

概要

Swingの各種コンポーネントで使用する全てのフォントを一気に変更します。

概要

Swingの各種コンポーネントで使用する全てのフォントを一気に変更します。 JavaHouse-Brewers:49474 Re: setFont に関してから引用しています。

サンプルコード

#spanend
#spanadd
private void updateFont(final Font font) {
#spanend
  FontUIResource fontUIResource = new FontUIResource(font);
  // 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);
  recursiveUpdateUI(this);
  frame.pack();
#spanadd
}
#spanend

#spandel
//#screenshot
#spanend
#spanadd
private void recursiveUpdateUI(JComponent p) {
#spanend
  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);
      }
    }
  }
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin

サンプルコード

Font font = new Font("Sans-serif", Font.TRUETYPE_FONT, 11);
FontUIResource fontUIResource = new FontUIResource(font);
UIDefaults defaultTable = UIManager.getLookAndFeelDefaults();
Set set = defaultTable.keySet();
Iterator it = set.iterator();
while(it.hasNext()) {
  Object o = it.next();
  if(o instanceof String) {
    String s = (String)o;
    if(s.endsWith("font") || s.endsWith("Font")) {
      UIManager.put(s, fontUIResource);
    }
  }
}

解説

上記のサンプルでは、ツールバーのボタンでコンポーネントが使用するフォントを切り替えています。ただしツールバーだけは、UIupdate(フォントの変更)を除外しています。
  • &jnlp;
  • &jar;
  • &zip;
    • -
  • 全コンポーネントではなく、例えばJTableのフォントだけ変更したい場合はTable.fontをキーにして以下のように設定する
    #spanend
    #spanadd
    UIManager.put("Table.font", new FontUIResource(font));
    #spanend
    #spanadd
    

解説

Windowsで使う場合、Font.TRUETYPE_FONTを使用すると、GUIの見栄えが大分良くなるようです。
  • 各コンポーネントのキーは、UIManagerからUIDefaultsのキー一覧が作成可能
    #spanend
    #spanadd
    // キー一覧の作成例
    #spanend
    #spanadd
    import javax.swing.UIManager;
    #spanend
    
    #spandel
    全部のコンポーネントではなく、例えばテーブルのフォントだけ変更したい場合は以下のように設定します。
    #spanend
     UIManager.put("Table.font", new FontUIResource(font));
    #spanadd
    class Test {
    #spanend
      public static void main(String[] args) {
        UIManager.getLookAndFeelDefaults().forEach((key, value) -> System.out.println(key));
      }
    #spanadd
    }
    #spanend
    #spanadd
    
UIManagerのキー一覧を作るなどして、いろいろ検索してみてください。
//キー一覧の作成例
Set set = UIManager.getLookAndFeelDefaults().keySet();
Iterator it = set.iterator();
while(it.hasNext()) {
  System.out.println(it.next());
}
  • -
この方法は、一々LookAndFeel作るのが面倒なときには便利です。サンプルではメイン関数の中で、コンポーネントを作成する前に一回だけ使用しています。フォントを変えるために、まじめにLookAndFeelを自作する場合は以下などを参考にしてみてください。
  • -
  • JComboBox#setFont(...)で使用するフォントのサイズを変更しても、JComboBox自体のサイズが更新されない
    • JCombobox doesn't get resized according to font size change
      #spanend
      #spanadd
      combo.setFont(font);
      #spanend
      #spanadd
      // 以下回避方法
      #spanend
      #spanadd
      combo.setPrototypeDisplayValue(null); // null:default?
      #spanend
      #spanadd
      // or combo.firePropertyChange("prototypeDisplayValue", 0, 1);
      #spanend
      #spanadd
      
また、フォントが気に入らないだけなら、Metalで使ってるフォントが格好悪いので、それを変更してやるだけでもいいかもしれません*1
#spanend
#spanadd
JLabel label = new JLabel() {
#spanend
  @Override public void updateUI() {
    super.updateUI();
    setFont(...);
  }
#spanadd
};
#spanend
#spanadd
try{
  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exception e) {
  //throw new InternalError(e.toString());
}

参考リンク

参考リンク

コメント