7

私はこのニンバスリファレンスを参照しています。

グローバルフォントを少し大きく設定しようとしました。

UIManager.put("defaultFont", new Font(Font.SANS_SERIF, 0, 16));

...メニューに対してのみ機能し、他にはも機能しません(ボタン、ラベル)。

ラベルとボタンのフォントを変更してみました

UIManager.put("Button.font", new Font(Font.SANS_SERIF, 0, 16));
UIManager.put("Label.font", new Font(Font.SANS_SERIF, 0, 16));

ただし、フォントは残ります。

私のために働いた唯一のことはフォントを導き出すことでした:

someButton.setFont(someButton.getFont().deriveFont(16f));

ただし、これはオプションではありません。これは、要素ごとに 手動で実行する必要があるためです。

UIManagerのフォントの導出も機能しないことに注意してください。

UIManager.put("Label.font",
    UIManager.getFont("Label.font").deriveFont(16f));

LinuxとWindowsですべてをテストしました:同じ動作です。

APIがいかに厄介なのか理解できません。メソッドがsetFont(..)と呼ばれる場合、フォントを設定することを期待しています。この方法で考えられる状況でフォントを設定できない場合は、非推奨にする必要があります。

編集:
この問題はニンバスだけでなく、デフォルトのLAFにも当てはまります。

4

6 に答える 6

8

これ、JDK6およびJDK7で機能します。コピーして貼り付けて楽しんでください;)

注:JDK6の場合は、に変更
javax.swing.plaf.nimbusして
com.​sun.​java.​swing.​plaf.​nimbusください。

コード

import java.awt.*;
import java.lang.reflect.*;
import javax.swing.*;
import javax.swing.plaf.nimbus.*;

public class Main {

 public static void main(String[] args)
   throws InterruptedException, InvocationTargetException {

  SwingUtilities.invokeAndWait(new Runnable() {

   @Override
   public void run() {
    try {
     UIManager.setLookAndFeel(new NimbusLookAndFeel() {

      @Override
      public UIDefaults getDefaults() {
       UIDefaults ret = super.getDefaults();
       ret.put("defaultFont",
         new Font(Font.MONOSPACED, Font.BOLD, 16)); // supersize me
       return ret;
      }

     });

     new JFrame("Hello") {

      {
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setLayout(new FlowLayout(FlowLayout.LEFT));

       setSize(500, 500);
       setLocationRelativeTo(null);

       add(new JLabel("someLabel 1"));
       add(new JButton("someButton 1"));
       add(new JLabel("someLabel 2"));
       add(new JButton("someButton 2"));

       setVisible(true);
      }

     };     
    } catch (Exception ex) {
     throw new Error(ex);
    }
   }

  });
 }

}
于 2010-04-04T23:16:54.527 に答える
5

ニンバスのデフォルトは遅延作成されるため、画面がペイントされる前に「defaultFont」を設定すると、フォントはニンバスのデフォルトではなく、親のデフォルトに追加されます。

回避策:nimbusにデフォルトを初期化し、次にデフォルトを設定するように強制します。

NimbusLookAndFeel laf = new NimbusLookAndFeel();
UIManager.setLookAndFeel(laf);
laf.getDefaults().put("defaultFont", new Font("Monospaced", Font.BOLD, 12));

注:このコードは、上記のようにgetDefaults()をオーバーライドするよりも効率的です。

于 2011-10-06T09:37:57.117 に答える
1

今日まで私を驚かせたのは、LaFセッター[setFont、setBackgroundなど]が実際には実際のプロパティを設定しないことです。仕様によると、LaFはユーザーが設定したフォントや色などを無視できます。これが、GTKLaFが完全に壊れている理由です。プログラマーの設定ではなく、システムのgtkテーマ設定を使用します。IIRC Nimbusには、デフォルト(NimbusDefaults?)を含み、簡単にアクセスできない個別のパッケージプライベートクラスがあります。

外観をカスタマイズする予定がある場合は、GTKやNimbusLAFを使用しないことをお勧めします。

クイックグーグル検索はGTKのためにこれを見つけます

ニンバスにおけるこれらの問題についての議論はここにあります。

于 2009-06-04T12:48:47.737 に答える
1

FontUIResourceでフォントをラップします。UIManagerの色でまったく同じ問題が発生し、ColorUIResourceですべてが修正されました。JDKを掘り下げることなく、コンポーネントがUIResourcesを期待する(読む:instanceofを介してチェックする)場所があると思います(おそらく誰かがこれを確認できます)

于 2009-06-04T12:57:47.890 に答える
1

1行のコードでの答え(すでにNimbus LaFを設定していると仮定):

UIManager.getLookAndFeelDefaults().put("defaultFont", new Font(Font.SANS_SERIF, 0, 20));

もちろん、GUIコンポーネントを作成する前に、つまりNimbus LaFを設定した直後にメインで、これを呼び出す必要があります。

于 2013-04-18T08:07:55.773 に答える
0

Java LAF APIは少し不器用ですが、ソースコードをチェックして答えを得るよりも良い方法はありません。

MetalLookAndFeelとNimbusは異なる実装であり、それぞれのプロパティは同じである必要はないことに注意してください。

次の例では、MetalLookAndFeelを使用しています。

package com.stackoverflow.laf.font;

import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class SetFontExample {

  public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
      @Override public void run() {
        UIManager.put("Label.font", new Font(Font.SANS_SERIF, 0, 20));
        try {
          UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {
          e.printStackTrace();
        }

        JFrame frame = new JFrame("Set font example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JLabel("Font test"));
        frame.pack();
        frame.setVisible(true);
      }
    });
  }
}

これが機能するのは、プロパティ「Label.font」がMetalに存在し、そのプロパティを正しく使用しているためです。

あなたはそれをこのようにチェックすることができます:

package com.stackoverflow.laf;

import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;

public class ListLAFUIDefaults {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override public void run() {
        try {
          // Choose LAF
          UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {
          e.printStackTrace();
        }
        UIDefaults defaults = UIManager.getLookAndFeel().getDefaults();
        System.out.println(defaults);

        // Check a property
        String propertyKey = "defaultFont";
        System.out.println(UIManager.getLookAndFeel().getName() +
            (defaults.containsKey(propertyKey) ? " contains " : " doesn't contain ") +
            "property " + propertyKey);
      }
    });
  }
}
于 2009-06-04T10:59:50.297 に答える