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

总是当我尝试在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()); }); }