2010-06-07 2 views
6

Я пытаюсь создать панель Swing, чьи элементы имеют другой размер шрифта, чем остальная часть приложения swing. Первоначально использование setFont для нескольких компонентов не создавало проблем. Теперь у меня есть несколько компонентов (и все их подкомпоненты), поэтому это решение нецелесообразно.Изменить размер шрифта JPanel и всех его элементов

Я искал об изменении свойств пользовательского интерфейса по умолчанию для компонентов swing. То, что я нашел, в основном использует UIManager, который изменяет свойства по всему миру. Это не работает для меня, потому что я хочу сохранить текущие настройки шрифта для всех остальных панелей.

На данный момент (и так как я не люблю оставлять, не пытаясь что-то из первых), у меня есть алгоритм, как это:

public static void fixFont(Container c) { 
    c.setFont(c.getFont().deriveFont(10.0f)); 
    Component[] comp = c.getComponents(); 
    for (int i=0;i<comp.length;++i) { 
     if (comp[i] instanceof Container) { 
      fixFont((Container) comp[i]); 
     } else { 
      comp[i].setFont(comp[i].getFont().deriveFont(10.0f)); 
     } 
    } 
} 

Проблема заключается в том, что:

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

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

Спасибо за ваши идеи

ответ

4

Вы могли бы использовать этот трюк:

import java.awt.*; 

public class FrameTest { 

    public static void setUIFont(FontUIResource f) { 
     Enumeration keys = UIManager.getDefaults().keys(); 
     while (keys.hasMoreElements()) { 
      Object key = keys.nextElement(); 
      Object value = UIManager.get(key); 
      if (value instanceof FontUIResource) { 
       FontUIResource orig = (FontUIResource) value; 
       Font font = new Font(f.getFontName(), orig.getStyle(), f.getSize()); 
       UIManager.put(key, new FontUIResource(font)); 
      } 
     } 
    } 

    public static void main(String[] args) throws InterruptedException { 

     setUIFont(new FontUIResource(new Font("Arial", 0, 20))); 

     JFrame f = new JFrame("Demo"); 
     f.getContentPane().setLayout(new BorderLayout()); 

     JPanel p = new JPanel(); 
     p.add(new JLabel("hello")); 
     p.setBorder(BorderFactory.createTitledBorder("Test Title")); 

     f.add(p); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(300, 300); 
     f.setVisible(true); 
    } 
} 

Производит:

enter image description here

+0

Я хочу изменить только шрифты панели и все ее элементы. Я не хочу менять шрифт других панелей. Выполнение этого с помощью UIManager изменяет шрифт для всех компонентов Swing. – YuppieNetworking

+0

А, хорошо. Не понимал, что вам нужно. Не знаю, как (или если это возможно) решить его сейчас, когда я понимаю ваш вопрос. – aioobe

+1

Одно «резервное» решение будет делать так же, как вы это делаете сейчас, но также проверять и обновлять границы через 'getBorder' и' instanceof TitledBorder'/'TitledBorder.setTitleFont' и т. Д. – aioobe

1

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

+0

По-прежнему не работает для границ и т. Д. – aioobe

+0

Он не будет работать для всех элементов внутри панели. Например: JPanel, который имеет JPanel с меткой. – YuppieNetworking

+0

может не работать для границ, но вы можете поместить любой код, который вам нравится, в свою реализацию «добавить», поэтому нет причин, по которым вы не могли бы назвать что-то вроде кода в своем вопросе. в принципе, я не думаю, что для этого есть простой ответ. это «неопрятная» операция. – pstanton

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