java swing минимальный (или диапазон для) размер шрифта для другого приложения

для приложений swing настройки шрифта по умолчанию для компонентов находятся в текущей теме и могут быть получены с помощью UIManager:

public class JavaTesting {
    public static void main(String[] args) {
        System.out.println(UIManager.get("Label.font"));
    }
}

это можно отрегулировать в JAVA_HOME/lib / swing.свойства для диапазона приложений, например:

swing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel

или установить в командной строке с помощью:

java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp

или само приложение запоминает его внешний вид и имеет это значение, хранящееся где-то в конфигурации (файл). Это работает, потому что приложение может установите look and feel для себя, например:

UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");      

это все выглядит хорошо, но приложения часто нуждаются мелкие шрифты (например, неважное сообщение строки состояния для метки) или крупные шрифты (метка с заголовком). есть ли рекомендуемый способ для этого? Как пользователь High density monitor мне пришлось отказаться от многих приложений java, которые используют такой код-исходный код, скопированный из squirrel sql:

Font tmp = (Font)UIManager.get("Label.font");
if (tmp != null) {
        Font font = tmp.deriveFont(10.0f);
        _statusBarFontInfo = new FontInfo(font);
}

в этом примере код делает строку состояния полностью нечитаемой, но большинство компонентов настраиваются на новый, больший шрифт.

для создания своего приложения, я мог бы использовать некоторые соотношение (например, от 50% до 150% шрифта темы), но hardcoding 0.50-1.50 диапазон выглядит как плохо кодирование habbit, а также. И это не устраняет проблему с приложениями, для которых у меня нет исходного кода. Это относится к теме / L&F (Look & Feel, Look and Feel). Пример:

FontUIResource Label_font_resource = (FontUIResource)javax.swing.UIManager.get("Label.font");
Font Label_font = Label_font_resource;
Font Label_font_bigger = Label_font.deriveFont(Label_font.getSize2D() * 1.5f);

стоит спросить, прежде чем я попробую некоторые уродливые хаки, такие как пользовательские компоненты, заменяющие Swing default, или Graphics2D.настройки setFont или любые другие страшные вещи. :-)

редактировать: единственное, что существует, это вариант размера, который поддерживается только темой Nimbus. Допустимые значения: "mini", "small", "regular", "large". Пример:

JComponent mini = new JButton("mini");
mini.putClientProperty("JComponent.sizeVariant", "mini");

однако, глядя в исходный код для темы Nimbus, невозможно просто отрегулируйте эти значения (например, масштаб до 150% для "большого"), это на самом деле жестко закодировано!

package javax.swing.plaf.nimbus;

public final class NimbusStyle extends SynthStyle
{
  public static final String LARGE_KEY = "large";
  public static final String SMALL_KEY = "small";
  public static final String MINI_KEY = "mini";
  public static final double LARGE_SCALE = 1.15D;
  public static final double SMALL_SCALE = 0.857D;
  public static final double MINI_SCALE = 0.714D;

это значение может быть отредактировано только очень продвинутым пользователем (например, редактировать пул констант в JAVA_HOME/lib/rt.jar с программой под названием "rej")-я пробовал, и она работает, но она не всегда работает, потому что они на самом деле жестко закодированы (!!) константы в нескольких местах (действительно ли это стандартная библиотека лучшего качества?), например:

if ("large".equals(str))
{
    this.scrollBarWidth = (int)(this.scrollBarWidth * 1.15D);
    this.incrGap = (int)(this.incrGap * 1.15D);
    this.decrGap = (int)(this.decrGap * 1.15D);
}

итог: нет, Java look and feel пока не поддерживает это. Я предлагаю использовать соотношения, например 0.7-1.3 размера шрифта по умолчанию.

JLabel smallLabel = new JLabel("some text");
smallLabel.setFont(smallLabel.getFont().deriveFont(0.8f * smallLabel.getFont().getSize2D()));

2 ответов


вместо изменения Font, нимб имеет sizeVariant для мини, маленьких, обычных и больших компонентов. Эта статья имеет больше примеров:изменение размера компонента.

myButton.putClientProperty("JComponent.sizeVariant", "mini");

то, что я сделал в моих приложениях Swing, включает класс шрифта. Каждый другой компонент Swing, которому нужен шрифт, вызывает класс Font.

import java.awt.Font;

public class MinesweeperFont {

    protected static final String FONT_NAME = "Comic Sans MS";

    public static Font getBoldFont(int pointSize) {
        return new Font(FONT_NAME, Font.BOLD, pointSize);
    }

}

в данном случае, мне нужен только один тип шрифта. Я позволил приложению выбрать размер шрифта.

вы можете определить метод для каждого размера шрифта, который вы хотите, вероятно, называя их маленькими, средними и большими, поэтому вы можете изменить методы позже, чтобы использовать другой размер или тип точки, если хотите.

С вашей все приложение вызывает эти статические методы шрифта, вам нужно только внести изменения шрифта в одном месте.