Java: Изменение шрифтов UI (Нимб) не работает!

Эта проблема также возникала для меня. Причиной стало то, что мы создали прозрачный веб-прокси (Squid). Брандмауэр здесь настроен на тихое перенаправление всего трафика порта 80 через Squid. Добавление исключения к имени хоста сервера SVN в конфигурации брандмауэра устранило проблему.

6
задан ivan_ivanovich_ivanoff 4 June 2009 в 12:26
поделиться

4 ответа

Это работает с 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);
    }
   }

  });
 }

}
8
ответ дан 8 December 2019 в 16:09
поделиться

Одна вещь, которая поражает меня по сей день, - это то, что сеттеры LaF [setFont, setBackground, и т. Д.] На самом деле не устанавливают реальные свойства. В спецификации сказано, что LaF могут игнорировать установленные пользователем шрифты, цвета и т. Д. Вот почему GTKLaF полностью не работает. Он использует системные настройки темы gtk, а не настройки программиста. IIRC Nimbus имеет отдельный частный класс пакета, который содержит значения по умолчанию (NimbusDefaults?), И к которому нелегко получить доступ.

Я предлагаю никогда никогда не использовать GTK или Nimbus LAF, если вы планируете настраивать внешний вид в любом

Быстрый поиск в Google дает это для GTK

Обсуждение этих проблем в nimbus можно найти здесь .

1
ответ дан 8 December 2019 в 16:09
поделиться

Оберните ваш шрифт в FontUIResource . У меня была такая же проблема с цветами UIManager, и ColorUIResource все исправил. Не копаясь в JDK, я думаю, что есть места, где компоненты ожидают (читайте: проверьте через instanceof) для UIResources (возможно, кто-то сможет это подтвердить)

1
ответ дан 8 December 2019 в 16:09
поделиться

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);
      }
    });
  }
}
0
ответ дан 8 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: