2010-08-14 4 views
5

Wie ändert man die Größe eines JButton zur Laufzeit, so dass es sich an den von setSize angegebenen Text anpasst? Ich habe ein wenig gesucht und das ist der Code, den ich bisher entwickelt habe. Könnte dies in eine Hilfsmethode umgewandelt werden?Größenänderung von JButtons und anderen Komponenten nach Text

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

S.: Kein Layout-Manager wird verwendet.

+1

Ich aktualisierte meine Antwort, ich denke, es tut was Sie wollen. – jjnguy

Antwort

6

Sie müssen setPreferredSize() auf der Komponente verwenden. Um die Größe zu ändern, wählen Sie setBounds().

Ich würde wahrscheinlich die Schaltfläche Unterklasse, und überschreiben die setText(String text) Methode, um die Größenänderung Code aufzunehmen.

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

Zum Testen habe ich dies im Konstruktor meiner neuen JButton Unterklasse:

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

Also, wenn ich auf die Schaltfläche geklickt Ich konnte den Text ändern und sehen, ob es die Größe neu bestimmt richtig.

+2

Die Zeile: "FontMetrics metrics = getFontMetrics (neue Schriftart (Font.SANS_SERIF, Font.PLAIN, 12));" sollte sagen: "FontMetrics metrics = getFontMetrics (getFont());", aber vielen Dank für dieses. :-) – AudioDroid

+0

@Audio, Sie sind willkommen. Und danke, dass du auf meinen Fehler aufmerksam gemacht hast. Ich habe es korrigiert. – jjnguy

+0

Ich sollte auch danke sagen. Dies sollte besonders nützlich für Anwendungen sein, die in mehr als einer Sprache angezeigt werden können. –

2

Ich hatte das gleiche Problem, auch wenn Sie einen Layout-Manager (BorderLayout) verwenden. Aber in meinem Fall genügte ein einfacher Aufruf an layoutContainer() des zugehörigen Layout-Managers und dann ein repaint() auf dem JFrame, um die Breite des Buttons zu ändern.

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

Der Tipp ist willkommen :) –