2012-02-16 81 views
5

Hay una pregunta similar aquí: How to change the size of the font of a JLabel to take the maximum size¿Cómo cambiar el tamaño de la fuente JLabel para llenar el espacio libre de JPanel mientras se cambia el tamaño?

pero no funciona al revés.

Así que si usted hace JPanel más grande, la fuente está creciendo, pero si lo hace más pequeño JLabel tamaño y la fuente permanece como antes

Check this Image

Como hacer Jlabel fuente creciente de acuerdo con JPanel tamaño al cambiar el tamaño?

+0

¿Usted intentó modyifying el código para solucionar el problema cuando se reduce el tamaño del marco? – camickr

Respuesta

0

bien, aquí está la respuesta.

Tomemos el código de aquí: How to change the size of the font of a JLabel to take the maximum size, respuesta de coobird

int componentWidth = label.getWidth(); 

Tenemos que conseguir la anchura del componente JFrame, no desde JLabel, debido a que el código será ninguna oportunidad Vamos a cambiar el tamaño de el JLabel.

esto lo arreglará:

int componentWidth = this.getWidth()-20; // '20' - according width of Jlabel to JFrame 
+2

para Contenedor.getSize/getBounds tiene que agregar Swing Timer, para evitar el parpadeo causado, solo llame para reiniciar hasta que el tamaño no termine, – mKorbel

+0

¿Por qué '20'; ¿No debería basarse esto en 'FontMetrics'? – trashgod

4

utilizando FontMetrics y TextLayout puede obtener esta salida (por favor leer un comentario en el código)

SwingUtilities puede hacerlo correctamente demasiado

I sugget añadir unos pocos píxeles, además, en ambas direcciones

añadir ComponentListener al envase y en caso componentResized volver a calcular de nuevo FontMetrics

enter image description here

import java.awt.*; 
import java.awt.font.TextLayout; 
import java.awt.geom.Rectangle2D; 
import javax.swing.*; 

public class ShowFontMetrics extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JLabel lTime; 

    public ShowFontMetrics() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel pane = new JPanel(); 
     pane.setLayout(new FlowLayout()); 
     lTime = new JLabel("88:88"); 
     lTime.setFont(new Font("Helvetica", Font.PLAIN, 88)); 
     FontMetrics fm = lTime.getFontMetrics(lTime.getFont()); 
     TextLayout layout = new TextLayout(lTime.getText(), lTime.getFont(), fm.getFontRenderContext()); 
     Rectangle2D bounds = layout.getBounds(); 
     Dimension d = lTime.getPreferredSize(); 
     d.height = (int) (bounds.getHeight() + 100);// add huge amount of pixels just for for fun 
     d.width = (int) (bounds.getWidth() + 150);// add huge amount of pixels just for for fun 
     lTime.setPreferredSize(d); 
     lTime.setVerticalAlignment(SwingConstants.CENTER); 
     lTime.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     pane.add(lTime); 
     setContentPane(pane); 
    } 

    public static void main(String[] arguments) { 
     ShowFontMetrics frame = new ShowFontMetrics(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

gracias. Pero no hace lo que quise decir ... La fuente de JLable debe cambiarse después de cambiar el tamaño de JFrame. Entonces, si hace que JFrame sea más grande/más pequeño, la fuente JLabel debe cambiarse también. – VextoR

+1

Hay un ejemplo relacionado que hace esto [aquí] (http://stackoverflow.com/a/8282330/230513). – trashgod

+0

Actualicé mi respuesta (probablemente no leí su pregunta ...) para CompomentListener, – mKorbel

4

¿Le gusta a esto? http://java-sl.com/tip_adapt_label_font_size.html

ACTUALIZACIÓN:

El código conforme a lo solicitado

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

public class ResizeLabelFont extends JLabel { 
    public static final int MIN_FONT_SIZE=3; 
    public static final int MAX_FONT_SIZE=240; 
    Graphics g; 

    public ResizeLabelFont(String text) { 
     super(text); 
     init(); 
    } 

    protected void init() { 
     addComponentListener(new ComponentAdapter() { 
      public void componentResized(ComponentEvent e) { 
       adaptLabelFont(ResizeLabelFont.this); 
      } 
     }); 
    } 

    protected void adaptLabelFont(JLabel l) { 
     if (g==null) { 
      return; 
     } 
     Rectangle r=l.getBounds(); 
     int fontSize=MIN_FONT_SIZE; 
     Font f=l.getFont(); 

     Rectangle r1=new Rectangle(); 
     Rectangle r2=new Rectangle(); 
     while (fontSize<MAX_FONT_SIZE) { 
      r1.setSize(getTextSize(l, f.deriveFont(f.getStyle(), fontSize))); 
      r2.setSize(getTextSize(l, f.deriveFont(f.getStyle(),fontSize+1))); 
      if (r.contains(r1) && ! r.contains(r2)) { 
       break; 
      } 
      fontSize++; 
     } 

     setFont(f.deriveFont(f.getStyle(),fontSize)); 
     repaint(); 
    } 

    private Dimension getTextSize(JLabel l, Font f) { 
     Dimension size=new Dimension(); 
     g.setFont(f); 
     FontMetrics fm=g.getFontMetrics(f); 
     size.width=fm.stringWidth(l.getText()); 
     size.height=fm.getHeight(); 

     return size; 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     this.g=g; 
    } 

    public static void main(String[] args) throws Exception { 
     ResizeLabelFont label=new ResizeLabelFont("Some text"); 
     JFrame frame=new JFrame("Resize label font"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.getContentPane().add(label); 

     frame.setSize(300,300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 
+0

+1 para 'deriveFont()'. – trashgod

+0

Sé que esta respuesta es antigua pero también es solo de enlace. Puede copiar la información necesaria del enlace. –

Cuestiones relacionadas