简体   繁体   中英

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. 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

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

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

 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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM