Изменение размера шрифта во время выполнения с помощью ползунка для всего приложения Java Swing с Nimbus L & F (Linux) - PullRequest
3 голосов
/ 04 ноября 2011

Следующий подход не работает для меня.Я не знаю, связано ли это с тем, что я использую Nimbus L & F, или, может быть, это потому, что я не перерисовываю компоненты должным образом после факта, или, может быть, это потому, что мое приложение является Netbeans SingleFrameApplication (мальчик, жалею ли я об этом решении) или, может быть, я упустил что-то очевидное.Я прочитал пару десятков сообщений на эту тему, и я экспериментировал с множеством различных подходов, но я не нашел ничего, что могло бы решить эту задачу.

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

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

public static void adjustGlobalFontSize(Float percentChange) {

    Enumeration keySet = UIManager.getDefaults().keys();
    while (keySet.hasMoreElements()) {
        Object key = keySet.nextElement();
        Object value = UIManager.get(key);
        if (value instanceof Font) {
            Font f = (Font)value;
            Float sizef = f.getSize2D() * percentChange;
            int size = Math.round(sizef);               
            FontUIResource resf = new FontUIResource(f.getName(), f.getStyle(), size);
            UIManager.put(key, resf);
        }
    }
    SwingUtilities.updateComponentTreeUI(MyApp.getApplication().getMainFrame());

}

РЕДАКТИРОВАТЬ 1: я переключился с Nimbus LAF на GTK LAF, как предлагается в комментариях.Я протестировал как приведенный выше код, так и код, предложенный в этом вопросе (который по сути идентичен).

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

Таким образом, проблема не связанапросто в Nimbus LAF.На самом деле, может быть, GTK хуже ...

Для справки, вот вывод кода в вопросе, связанном выше.

                 Menu.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
       ScrollPane.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      SliderThumb.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
     ColorChooser.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
        PopupMenu.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
            Panel.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
            Table.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      DesktopIcon.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
         ComboBox.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
 FormattedTextField.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      RadioButton.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
  InternalFrame.titleFont :                   java.awt.Font[family=DejaVu Sans,name=DejaVu Sans,style=bold,size=12]
             Tree.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
           Button.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
 PopupMenuSeparator.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
         TextArea.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
InternalFrameTitlePane.font :javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      ArrowButton.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
         Viewport.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
   ScrollBarThumb.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
       EditorPane.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
   ScrollBarTrack.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
        ScrollBar.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      ProgressBar.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      FileChooser.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
     ToggleButton.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
          ToolBar.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
         MenuItem.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
           defaultFont : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
         RootPane.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
         TextPane.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
           Slider.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
          MenuBar.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
             List.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
 CheckBoxMenuItem.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
        SplitPane.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
        Separator.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
          Spinner.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
          ToolTip.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
    PasswordField.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
        TextField.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
       TabbedPane.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
       OptionPane.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
     TitledBorder.font :                    java.awt.Font[family=DejaVu Sans,name=DejaVu Sans,style=bold,size=12]
            Label.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      SliderTrack.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      TableHeader.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
RadioButtonMenuItem.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
         CheckBox.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
    InternalFrame.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]
      DesktopPane.font : javax.swing.plaf.FontUIResource[family=DejaVu Sans,name=DejaVu Sans,style=plain,size=12]

РЕДАКТИРОВАТЬ 2: Дополнительная информация: Если я неНе пытайтесь внести изменения во время выполнения, но вместо этого вызовите метод при запуске приложения до создания каких-либо элементов графического интерфейса, у меня есть некоторая мера успеха.Большинство шрифтов масштабируются по желанию.Основными исключениями являются кнопки, переключатели и текстовые области.Это странно, потому что все они перечислены в обновленном коде выше.Другие компоненты, такие как ComboBoxes, JLables и многие другие, получают обновленные размеры шрифтов.

В качестве первого шага, я думаю, мне следует сосредоточиться на том, чтобы все работало таким образом (т.е. менялось только до запуска).Есть идеи, почему не все шрифты обновляются?

...