簡體   English   中英

如何在javafx中獲取label.getWidth()

[英]How to get label.getWidth() in javafx

總是當我嘗試在Java中獲取數組的寬度時,它只返回0,我不知道為什么。 有人可以向我解釋它是如何做的正確嗎?

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

但它沒有用 - 你能更准確地解釋一下我需要做什么嗎?

要獲得調用prefWidth(-1)和prefHeight(-1)所需的寬度,只有控件通過resizeRelocate進行布局后才能設置布局邊界

要在顯示階段之前獲得正確的寬度,您還需要調用impl_processCSS(true)這是一個NONE公共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));

另一種方法是使用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

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

我不認為在顯示標簽之前會計算寬度:將其添加到可見的父級,您應該得到非零結果。

您可以嘗試以下方法:

func foo()
{
    label.layout();

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM