2010-06-07 18 views
6

Próbuję utworzyć panel Swing, którego elementy mają inny rozmiar czcionki niż reszta aplikacji swing. Początkowo używanie setFont dla kilku składników nie stanowiło problemu. Teraz mam kilka komponentów (i wszystkie ich podkomponenty), więc to rozwiązanie jest niepraktyczne.Zmiana rozmiaru czcionki JPanel i wszystkich jej elementów

Szukałem informacji o zmianie domyślnych właściwości interfejsu użytkownika komponentów swing. Znalazłem głównie UIManager, który zmienia właściwości na całym świecie. Nie działa to dla mnie, ponieważ chcę zachować bieżące ustawienia czcionek dla wszystkich pozostałych paneli.

W tej chwili (a ponieważ nie podoba mi odpowiedzieć, nie próbując coś pierwszy), mam algorytm takiego:

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)); 
     } 
    } 
} 

Problem polega na tym, że:

  • to nie obejmuje niektórych elementów swingujących, takich jak jego obramowanie.
  • muszę wywołać tę funkcję kiedy dodać inne składniki dynamicznie

Pytanie: Czy istnieje inny sposób na zmianę właściwości czcionki panelu swing i wszystkie jego komponenty, elementy itd (czyli wszystko panel) ?

Dzięki za pomysły

Odpowiedz

4

można użyć tej sztuczki:

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); 
    } 
} 

Produkuje:

enter image description here

+0

Chcę zmienić tylko czcionki panelu i wszystkie jego elementy. Nie chcę zmieniać czcionki innych paneli. Wykonanie tej czynności za pomocą narzędzia UIManager zmienia czcionkę dla wszystkich komponentów Swing. – YuppieNetworking

+0

Ah, dobra uwaga. Nie zdawałem sobie sprawy, czego naprawdę potrzebujesz. Nie wiem, jak (lub jeśli to możliwe) rozwiązać teraz, gdy rozumiem twoje pytanie. – aioobe

+1

Jednym z "zapasowych" rozwiązań byłoby zrobić tak, jak to robisz teraz, ale również sprawdzić i zaktualizować granice poprzez 'getBorder' i' instanceof TitledBorder'/'TitledBorder.setTitleFont' etc – aioobe

1

można zastąpić metodę add na składnika podstawowego i zastosować czcionkę do dodanych komponentów i ich dzieci. pozwoliłoby to na ręczne stosowanie czcionki po dodaniu komponentów później.

+0

Nadal nie będzie działać dla granic itp ... – aioobe

+0

Nie będzie działać dla wszystkich elementów wewnątrz panelu. Na przykład: JPanel, który ma JPanel z etykietą. – YuppieNetworking

+0

może nie działać dla granic, ale możesz umieścić dowolny kod w swojej implementacji "dodaj", więc nie ma powodu, dla którego nie mógłbyś wywołać kodu podobnego do twojego pytania. w zasadzie, nie sądzę, że jest na to prosta odpowiedź. to operacja "niechlujna". – pstanton

Powiązane problemy