2016-06-29 17 views
1

Es gibt natürlich die beiden Methoden getWidth und getHeight, aber sie geben die alte Etikettengröße zurück, wenn wir nur den Label Textwert geändert haben.Wie kann ich die Breite und Höhe eines JavaFX-Labels erhalten?

Zum Beispiel in diesem Code wird der Hintergrund nicht richtig die Größe neu bestimmt:

Label speedLabel = new Label(); 
Rectangle backgroundLabel = new Rectangle(); 

// Some initialization 

// Change the label text 
speedLabel.setText(connection.getSpeed_bps()); // Sets a bigger number 

// Adjust the background 
backgroundLabel.setWidth(speedLabel.getWidth()); 
backgroundLabel.setHeight(speedLabel.getHeight()); 

Nach der Initialisierung meines Label wie das ist:

enter image description here

Und nach der Textänderung und die Hintergrundeinstellung, meine Label ist so:

enter image description here

hatte ich einen Blick auf dieses Thema, aber es empfiehlt eine veraltete Methode:

How to get label.getWidth() in javafx

+0

Sie konnten die Bindung ** backgroundLabel Breite und Höhe ** zum ** speedLabel Breite und Höhe ** z.B – SSchuette

+2

Mögliches Duplikat von [Wie berechnet man die Pixelbreite eines Strings in JavaFX?] (Http://stackoverflow.com/questions/13015698/how-to-cal-the-pixel-width-of-a-string-in) -javafx) (Auch [Holen Sie die Höhe eines Knotens in JavaFX (generieren Sie einen Layout-Durchlauf)] (http://stackoverflow.com/questions/26152642/get-the-height-of-a-node-in-javafx- generate-a-layout-pass)) – fabian

Antwort

2

Der Grund für die „alte“ Größe zurückkehrt, dass das Etikett nicht tatsächlich auf der GUI aktualisiert werden in der Moment, als Sie die textProperty davon einstellen, deshalb wird die Größe nicht geändert.

Sie können auf die widthProperty hören und heightProperty des Label und die Rectangle im Hörer die Größe:

speedLabel.widthProperty().addListener((obs, oldVal, newVal) -> { 
    backgroundLabel.setWidth(newVal.doubleValue()); 
}); 

speedLabel.heightProperty().addListener((obs, oldVal, newVal) -> { 
    backgroundLabel.setHeight(newVal.doubleValue()); 
}); 

oder verwenden Sie einfach Bindungen zwischen den Eigenschaften:

backgroundLabel.heightProperty().bind(speedLabel.heightProperty()); 
backgroundLabel.widthProperty().bind(speedLabel.widthProperty()); 

Aber wenn Sie nur wollen Um eine Label mit etwas Hintergrund zu erreichen, brauchen Sie nicht wirklich eine Rectangle, nur ein paar CSS - Sie können diese Frage überprüfen: FXML StackPane doesn't align children correctly

+0

"Es gibt keine setWidth-Methode für ein Label" -> Leider habe ich einige Code-Deklarationen vergessen. Ihre Lösung funktioniert gut, danke: 'backgroundLabel.widthProperty(). Bind (speedLabel.widthProperty());' 'backgroundLabel.heightProperty().bind (speedLabel.heightProperty()); ' Kann ich aber einen Rand bei der Etikettenbreite hinzufügen? –

+0

Ich nahm gerade an, dass das andere Steuerelement ein "Label" ist, auch wegen seines Namens. Jetzt mit dem Update sehe ich ein 'Rectangle' -> Antwort wird aktualisiert. Über den Rand: Jetzt, wenn Ihre Frage aktualisiert wird, kann ich sehen, was Sie erreichen möchten. Bitte sehen Sie das Ende der aktualisierten Antwort. – DVarga

0

Sie können es auf zwei Arten tun.

Ansatz 1: Geben Sie die Hintergrundfarbe Ihres Etiketts als Rechteck an. Also, was auch immer die Label's Größe ist, nimmt Ihr Hintergrundrechteck die Breite entsprechend.

label.setStyle("-fx-background-color:grey; -fx-padding:5"); 

Ansatz 2: Bind der Größe des Rectangle entsprechend Ihrer Etikettengröße

rectangle.prefWidthProperty(label.widthProperty()); 
rectangle.prefHeightProperty(label.heightProperty()); 
Verwandte Themen