2010-01-11 2 views
10

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

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

ответ

0

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

6

Есть две части к этому:

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

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

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

В Windows это будет заставлять его соблюдать настройку Small/Large fonts (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(); 
      } 
     }); 
    } 

} 

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

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

Уже поздно - так оно и есть.

Смежные вопросы