2010-06-07 63 views
6

Estoy tratando de crear un panel Swing cuyos elementos tengan un tamaño de letra diferente al resto de la aplicación swing. Inicialmente, usar setFont para un par de componentes no presentaba ningún problema. Ahora tengo varios componentes (y todos sus subcomponentes), por lo que esta solución no es práctica.Cambiar el tamaño de fuente de un JPanel y todos sus elementos

He buscado sobre el cambio de las propiedades de IU predeterminadas de los componentes oscilantes. Lo que he encontrado es principalmente el uso de UIManager, que cambia las propiedades de forma global. Esto no funciona para mí porque quiero mantener la configuración de fuente actual para todos los demás paneles.

Por el momento (y ya que no me gusta para publicar algo sin tratar, en primer lugar), tengo un algoritmo como esto:

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

El problema es que:

  • se no incluye ciertos elementos de giro como su borde.
  • Tengo que llamar a esta función cuando agrego otros componentes dinámicamente

Pregunta: ¿Hay otra manera de cambiar las propiedades de la fuente de un panel de media vuelta y todos sus componentes, elementos, etc (es decir, todo en el panel) ?

Gracias por sus ideas

Respuesta

4

podría utilizar este truco:

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

Produce:

enter image description here

+0

Quiero cambiar solo las fuentes del panel y todos sus elementos. No quiero cambiar la fuente de otros paneles. Al hacer esto con UIManager, se cambia la fuente de todos los componentes de Swing. – YuppieNetworking

+0

Ah, buen punto. No me di cuenta de lo que realmente necesitabas. No estoy seguro de cómo (o si es posible) resolverlo ahora que entiendo tu pregunta. – aioobe

+1

Una solución de "copia de seguridad" sería hacer lo mismo que ahora, pero también verificar y actualizar los bordes mediante 'getBorder' y' instanceof TitledBorder'/'TitledBorder.setTitleFont' etc. – aioobe

1

se podría reemplazar el método add de su componente de base y aplicar la fuente a los componentes agregados y sus hijos allí. esto le ahorrará la aplicación manual de la fuente cuando los componentes se agreguen más tarde.

+0

Todavía no funciona para bordes, etc. – aioobe

+0

No funcionará para todos los elementos dentro del panel. Por ejemplo: un JPanel que tiene un JPanel con una etiqueta. – YuppieNetworking

+0

podría no funcionar para bordes, pero podría poner cualquier código que desee en su implementación 'agregar', por lo que no hay ninguna razón por la que no pueda llamar algo así como el código en su pregunta. Básicamente, no creo que haya una respuesta fácil para esto. es una operación 'desordenada'. – pstanton

Cuestiones relacionadas