2014-01-12 49 views
3

總是當我嘗試獲得在Java中的數組的寬度它只是返回0,我不知道爲什麼。有人可以向我解釋它是如何完成的嗎?如何獲得javafx中的label.getWidth()

   Label label = new Label(); 
       label.setFont(Font.font(label.getFont().getFamily(), 8)); 
       label.setText("" 
         + a[i][j].getList().getFirst().getLength() 
         + " mal " 
         + intToColor(a[i][j].getList().getFirst() 
           .getColor())); 
       label.relocate((x1 + x2)/2 - label.getWidth()/2, (y1 + y2)/2); 
       label.idProperty().set("trackName"); 
       label.setTextFill(Color.web("GREEN")); 
       field.getChildren().addAll(path, label); 
       System.out.println(label.getLayoutBounds().getWidth()); 
       System.out.println(label.getWidth());//... also i tested a lot of different getters but i couldn't get the label width (same problem with height) 

希望你有個想法我必須做的。

@tomsontom

這樣做:

   label.prefWidth(-1); 
       label.prefHeight(-1); 
       label.impl_processCSS(true); 
//     label.resizeRelocate(x, y, width, height); 
       System.out.println(label.getWidth()); 

但它沒有工作 - 你能更正是我需要做的解釋我?

回答

7

爲了得到你需要調用prefWidth(-1)和prefHeight(-1)的佈局界限只設置一次的控制是通過resizeRelocate

layouted爲了得到正確的寬度顯示在舞臺前的寬度你還需要調用impl_processCSS(真),這是一種無公共API,但沒有什麼更好的時刻IIRC

HBox h = new HBox(); 
Label l = new Label("Hello"); 
h.getChildren().add(l); 
Scene s = new Scene(h); 
l.impl_processCSS(true); 
System.err.println(l.prefWidth(-1)+"/"+l.prefHeight(-1)); 
+0

*已編輯的問題 - 感謝您的幫助,但我有一些問題,以瞭解什麼exacltly我需要做的。 – baxbear

+0

我已經添加了代碼 - 對我的回答 – tomsontom

+0

非常感謝 – baxbear

1

我不認爲寬度將被計算,直到顯示標籤:將其添加到可見的父,你應該得到一個非零的結果。

+0

謝謝你,但有什麼辦法,我可以得到寬度之前,我告訴他們,因爲這是一個循環的一部分,我產生了100標籤的他們是前所示。 – baxbear

+0

@baxbear我不這麼認爲 - 想象你將你的標籤放在一個AnchorPane中,標籤填滿了整個區域 - 尺寸取決於AnchorPane的大小,這可能取決於它的容器的大小等等。因此,標籤的實際可見尺寸取決於它將如何以及在何處顯示,直到它變得可見時纔可用。 – assylias

+0

你應該解釋爲什麼你需要知道尺寸的原因 - 可能有更好的方法。 – assylias

2

另一種方法是使用Fontloader.computeStringWidth(text, font)計算標籤的textProperty的字符串寬度將輸出像素寬度標籤的textProperty,這與獲得標籤'當標籤在後面的部分被標出時,標籤的寬度。

對於一個實例:

FontLoader fontLoader = Toolkit.getToolkit().getFontLoader(); 
    Label label = new Label("My name is Warren. I love Java."); 
    label.setFont(Font.font("Consolas", FontWeight.THIN, FontPosture.REGULAR, 16)); 
    System.out.println("The label's width is: " + fontLoader.computeStringWidth(label.getText(), label.getFont())); 

輸出是:

The label's width is: 272.70312 

測試:

FontLoader fontLoader = Toolkit.getToolkit().getFontLoader(); 
    Label label = new Label("My name is Warren. I love Java."); 
    label.setFont(Font.font("Consolas", FontWeight.THIN, FontPosture.REGULAR, 16)); 
    System.out.println("The label's textProperty string width is: " + fontLoader.computeStringWidth(label.getText(), label.getFont())); 
    System.out.println("Label's width before layouted: " + label.getWidth()); 
    primaryStage.setScene(new Scene(new StackPane(label), 300, 250)); 
    primaryStage.show(); 
    System.out.println("Label's width after layouted: " + label.getWidth()); 

下面是輸出

The label's textProperty string width is: 272.70312 
Label's width before layouted: 0.0 
Label's width after layouted: 273.0 

相比之下,它們是相同的。希望這可以幫助。

1

你可以嘗試以下方法:

func foo() 
{ 
    label.layout(); 

    Platform.runLater(()-> 
    { 
     System.out.println(label.getWidth()); 
    }); 
} 
+1

確認爲工作 –

相關問題