简体   繁体   English

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

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

always when i try to get the width of an Array in Java it just returns 0 and i dont know why. 总是当我尝试在Java中获取数组的宽度时,它只返回0,我不知道为什么。 Can somebody explain to me how it is done right? 有人可以向我解释它是如何做的正确吗?

                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)

Hope you got an idea what i have to do. 希望你知道我要做什么。

@tomsontom @tomsontom

did this: 做过这个:

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

but it didnt worked - can you explain me more precisely what i need to do? 但它没有用 - 你能更准确地解释一下我需要做什么吗?

To get the width you need to call prefWidth(-1) and prefHeight(-1) the layout bounds are only set once the control is layouted through resizeRelocate 要获得调用prefWidth(-1)和prefHeight(-1)所需的宽度,只有控件通过resizeRelocate进行布局后才能设置布局边界

To get the correct width before the stage is shown you also need to call impl_processCSS(true) which is an NONE public API but there's nothing better at the moment IIRC 要在显示阶段之前获得正确的宽度,您还需要调用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));

Another approach is to calculate the string width of the label's textProperty using Fontloader.computeStringWidth(text, font) which would output the pixel width of the label's textProperty, and is considerably similar to getting the label's width when the label is layouted at the later part. 另一种方法是使用Fontloader.computeStringWidth(text, font)计算标签的textProperty的字符串宽度,该字符宽度将输出标签的textProperty的像素宽度,并且非常类似于在后面的部分布置标签时获取标签的宽度。

For an instance: 例如:

    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 output is: 输出是:

The label's width is: 272.70312

To test: 去测试:

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

Here's the output 这是输出

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

Comparably, they are the same. 相比之下,它们是相同的。 Hope this helps. 希望这可以帮助。

我不认为在显示标签之前会计算宽度:将其添加到可见的父级,您应该得到非零结果。

You can try the following: 您可以尝试以下方法:

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