Java автоматически подстраивается под размер шрифта Windows 7 - PullRequest
10 голосов
/ 12 января 2010

В Windows 7, если вы измените размер шрифта через Панель управления-> Оформление и персонализация -> Отображение «Делать текст и другие элементы больше или меньше», он регулирует не только размеры меню, но и размер содержимого текста. приложений, таких как Блокнот, Wordpad, Firefox.

Есть ли способ заставить Java автоматически масштабировать шрифт без необходимости вручную масштабировать его?

Ответы [ 2 ]

6 голосов
/ 16 января 2010

Это две части:

  1. Получение ваших компонентов, шрифтов и т. Д. масштабировать
  2. Получение ваших макетов шкала

Для Swing первая часть проста - все начинается с одного звонка.

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

В Windows это будет соответствовать вашим настройкам для шрифтов малого / большого размера (DPI).

Вот два скриншота из приложения для быстрого тестирования, которое я создал вместе, демонстрируя, как оно выглядит на моей машине в Windows 7 при 96dpi (нормальный размер шрифта) и @ 144dpi (150%)

Сначала образец размера шрифта по умолчанию:

Swing app with Windows using normal font sizes

Теперь с увеличенным размером шрифта (150%):

Swing app with Windows using Larger font sizes

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

Вот мой исходный код - вырезайте и вставляйте и запускайте его самостоятельно:

import java.awt.FlowLayout;

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

public class SwingFontTest
{
    private static void createGUI()
    {
        JButton button = new JButton("my button with Some Text");
        JLabel label = new JLabel("and a label");

        JPanel panel = new JPanel(new FlowLayout());
        panel.add(button);
        panel.add(label);

        JFrame frame = new JFrame("Title!");
        frame.setContentPane(panel);
        frame.setSize(300,125);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run()
            {
                createGUI();
            }
        });
    }

}

Look & Feel предоставляет размеры по умолчанию, но автору графического интерфейса следует использовать масштабируемые единицы в их макетах. Это требует усилий (масштабируемые макеты - тоже боль на веб-страницах!), Но это определенно достижимо.

Я рекомендую использовать макет, такой как FormLayout , который позволит вам определять макеты в диалоговых единицах (DLU), так как они масштабируются с DPI. Это позволит вам масштабировать контейнеры по размеру и должно помочь ограничить поведение, например, перемещение метки на следующую строку из-за изменения размера. Если размер кадра был определен с использованием диалоговых блоков, то его можно было бы сделать таким же, только больше.

Уже поздно - вот и все.

0 голосов
/ 12 января 2010

Это будет полностью зависеть от того, какой инструментарий GUI вы используете. Я почти уверен, что SWT, например, автоматически подберет новые размеры (поскольку он использует нативные виджеты). AWT может с таким же успехом, насколько я знаю. Можете ли вы указать, какой инструментарий вы используете, и определили ли вы, что он еще не делает то, что вы хотите (и, возможно, как)?

...