2009-08-03 10 views
1

Ich muss eine Schaltfläche erstellen, die verschiedene Dinge je nach Status anzeigen, wenn die App. Wenn also zum Beispiel nichts geöffnet wurde, lautet der Titel "Lesson Plans" und wenn Projekt B geöffnet ist, wird es "Projekt B Lesson Plan" sein, dafür verwende ich die java.awt.Button-Klasse. Meine Frage, gibt es eine Möglichkeit zu bestimmen, wie groß der Knopf sein sollte, um den gegebenen Text zu passen. Zum Beispiel kann ich irgendwie die Breite jedes Zeichens in der gegebenen Schriftart, die von der Schaltfläche verwendet wird, erhalten, dann multipliziere dies mit den Zeichen in dem Titel, den ich verwenden möchte? Wie würde ich diese Zeichenbreite erhalten oder gibt es einen besseren Weg? Vielen Dank!So messen Sie die benötigte Größe für eine Schaltfläche in Java

+0

freundliche Erinnerung - achten Sie darauf, nicht beide AWT und Swing-Komponenten zu mischen und anzupassen. – akf

Antwort

4

Das Messen von Breiten einzelner Zeichen in bestimmten Schriftarten (nicht alle Zeichen sind gleich breit) wird kompliziert, besonders wenn Sie die Leerzeichen zwischen Zeichen berücksichtigen und einige Ränder auf jeder Seite hinzufügen möchten, damit sie nicht aneinanderstoßen gegen die Ränder des Knopfes. (N.B. Andere haben einige Möglichkeiten, dies einfacher zu tun, als ich erkannte, war möglich!)

Viel besser/üblichere Lösung ist es, Java die Arbeit für Sie tun lassen. Wenn Sie eine java.awt.Button (oder javax.swing.JButton) verwenden, wird sie normalerweise automatisch an den Text angepasst. Wenn sich Ihr bestimmter Button merkwürdig verhält, dann haben Sie wahrscheinlich ein Layout-Problem. Weitere Informationen finden Sie im Abschnitt des Java-Lernprogramms unter Layout Managers.

Als Beispiel (! In Swing, anstatt AWT - sorry), wobei diese beiden Tasten sind die richtige Größe für den Text auf sie am Ende:

import javax.swing.*; 

public class ButtonTest { 
    public static void main(String[] args) { 
     JButton button1 = new JButton("Some label"); 
     JButton button2 = new JButton("Some much longer label"); 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     panel.add(button1); 
     panel.add(button2); 
     frame.getContentPane().add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Wenn Sie wirklich die Größe tun wollen, eher als Java einfach sein Bestes geben zu lassen, dann würde ich empfehlen, button1.getPreferredSize() und button2.getPreferredSize() nach dem Anruf an frame.pack() zu nennen.

+0

Ja scheint meine Taste scheint immer so viel Platz wie möglich zu nehmen, so dass ich eine Art Layout-Problem haben muss, werde ich diesen Link überprüfen. Danke vielmals. – Mike2012

+1

Nur eine Vermutung, aber Sie könnten BorderLayout verwenden - das dehnt Komponenten so aus, dass sie auf den verfügbaren Platz passen, anstatt sie in ihrer bevorzugten Größe zu belassen.Wenn das das Problem ist, können Sie versuchen, Ihre Schaltfläche zu einem Panel hinzuzufügen und dann stattdessen das Panel hinzuzufügen. Könnte aber völlig falsch sein, da ich nicht weiß, was das eigentliche Problem ist! :) –

0

Nur ein kurzer Blick auf die API-Dokumentation zeigt:

public Rectangle2D getStringBounds(String str, FontRenderContext frc) 

in java.awt.Font

Gibt die logischen Grenzen des angegebenen String im angegebenen FontRenderContext. Die logischen Grenzen enthalten den Ursprung, Aufstieg, Fortschritt, und Höhe, die den führenden enthält.

Das sollte Ihnen also helfen.

0

Haben Sie versucht, entweder getMinimumSize() oder getPreferredSize() auf der Schaltfläche? Ich glaube, einer von ihnen wird Ihnen die minimale Größe sagen, die der Knopf sein muss, um sein Etikett anzuzeigen.

0

Auf der AWT-Taste können Sie getFontMetrics aufrufen und dann nach den getStringBounds fragen. Auf dieser Basis können Sie dann die bevorzugte Größe der Schaltfläche festlegen. Der zusätzliche Abstand, den Sie für die Ränder benötigen, wird jedoch nicht berücksichtigt (je nach Plattform).

Ich würde versuchen, jedes zu den Zeichenketten der Reihe nach zu setzen, die bevorzugten Größen zu erhalten und dann nur die bevorzugte Größe für die größte Größe einzustellen.

Verwandte Themen