2010-08-14 7 views
5

¿Cómo se cambia el tamaño de un JButton en tiempo de ejecución para que se adapte al texto proporcionado por setSize? He hecho algunas búsquedas y este es el código que he encontrado hasta ahora. ¿Podría esto convertirse en un método de utilidad?Cambiar el tamaño de JButtons y otros componentes según el texto

FontMetrics metrics = getFontMetrics(font); 
int width = metrics.stringWidth(string); 

P.S: No se está utilizando el administrador de diseño.

+1

He actualizado mi respuesta, creo que hace lo que quiere. – jjnguy

Respuesta

6

Necesita usar setPreferredSize() en el componente. Luego, para cambiar el tamaño, llame al setBounds().

Probablemente subclase el botón y anule el método setText(String text) para incluir el código de cambio de tamaño.

@Override 
public void setText(String arg0) { 
    super.setText(arg0); 
    FontMetrics metrics = getFontMetrics(getFont()); 
    int width = metrics.stringWidth(getText()); 
    int height = metrics.getHeight(); 
    Dimension newDimension = new Dimension(width+40,height+10); 
    setPreferredSize(newDimension); 
    setBounds(new Rectangle(
        getLocation(), getPreferredSize())); 
} 

Para las pruebas, lo hice en el constructor de mi nuevo JButton subclase:

public ResizeToTextButton(String txt){ 
    super(txt); 
    addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      setText(JOptionPane.showInputDialog("Text")); 
     } 
    }); 
} 

Por lo tanto, cada vez que se hace clic en el botón que podría cambiar el texto y ver si se cambia el tamaño correctamente.

+2

La línea: "FontMetrics metrics = getFontMetrics (new Font (Font.SANS_SERIF, Font.PLAIN, 12));" debería decir: "FontMetrics metrics = getFontMetrics (getFont());", pero muchas gracias por este. :-) – AudioDroid

+0

@Audio, eres bienvenido. Y gracias por señalar mi error. Lo he corregido – jjnguy

+0

También debería decir gracias. Esto debería ser particularmente útil para aplicaciones que se pueden mostrar en más de un idioma. –

2

Tuve el mismo problema, incluso cuando uso un administrador de diseño (BorderLayout). Pero en mi caso, una simple llamada al layoutContainer() del administrador de disposición asociado y luego un repaint() en el JFrame fue suficiente para cambiar el ancho del botón.

button1.setText("New Label that differs in width"); 
// button1 is inside the container horizontalBox 
horizontalBox.getLayout().layoutContainer(horizontalBox); 
repaint(); // on the containing JFrame 
+0

El consejo es bienvenido :) –

Cuestiones relacionadas