2010-08-14 3 views
5

Come si ridimensiona un JButton in fase di esecuzione in modo che si adatta al testo dato dal setSize? Ho fatto qualche ricerca e questo è il codice che ho inventato finora. Potrebbe essere trasformato in un metodo di utilità?Ridimensionamento JButtons e altri componenti in base al testo

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

P.S: non viene utilizzato alcun gestore di layout.

+1

Ho aggiornato la mia risposta, penso che faccia quello che vuoi. – jjnguy

risposta

6

è necessario utilizzare setPreferredSize() sul componente. Quindi, per ridimensionarlo, chiamare setBounds().

avrei probabilmente sottoclasse il pulsante, e l'override del metodo setText(String text) di includere il codice di ridimensionamento.

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

Per il test, ho fatto questo nel costruttore della mia nuova JButton sottoclasse:

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

Così, ogni volta ho cliccato sul pulsante ho potuto cambiare il testo e vedere se ridimensionata propriamente.

+2

La riga: "FontMetrics metrics = getFontMetrics (nuovo Font (Font.SANS_SERIF, Font.PLAIN, 12));" dovrebbe dire: "FontMetrics metrics = getFontMetrics (getFont());", ma grazie mille per questo. :-) – AudioDroid

+0

@Audio, prego. E grazie per aver segnalato il mio errore. L'ho corretto – jjnguy

+0

Dovrei anche dire grazie. Questo dovrebbe essere particolarmente utile per le applicazioni che possono essere visualizzate in più di una lingua. –

2

Ho avuto lo stesso problema, anche quando si utilizza un gestore di layout (BorderLayout). Ma nel mio caso una semplice chiamata a layoutContainer() del gestore di layout associato e quindi un repaint() su JFrame era sufficiente per modificare la larghezza del pulsante.

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

Il suggerimento è benvenuto :) –