如何在布置之前获得标签的尺寸?

时间:2015-06-22 15:11:29

标签: javafx label size

我读了this关于如何实现这一目标的旧答案。但由于它涉及使用impl_processCSS(boolean),现在已弃用的方法,我认为我们需要更新答案。

我已经尝试将标签放在HBox中,然后获得它的大小,或者获得HBox的大小,没有任何运气。我也尝试过使用.label.getBoundsInLocal()。getWidth()。

SSCCE:     import javafx.scene.control.Label;     import javafx.scene.layout.HBox;     import javafx.application.Application;     import javafx.scene.Scene;

public class SSCCE extends Application{

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        HBox root = new HBox();
        Label label = new Label("foo");
        System.out.println(label.getWidth());

        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

1 个答案:

答案 0 :(得分:3)

自JavaFX 8以来,您正在寻找的方法是applyCss()

正如JavaDoc所述:

  

将样式应用于此节点及其子节点(如果有)。此方法通常不需要直接调用,但可以与Parent.layout()一起使用,以在下一个脉冲之前调整节点大小,或者如果场景不在舞台中。

因此,您需要在容器中拥有该节点,并且该节点已经在场景中,并且还要调用layout()

@Override
public void start(Stage primaryStage) {
    Group root = new Group();
    Label label = new Label("foo bla bla");
    root.getChildren().add(label);
    Scene scene = new Scene(root);

    root.applyCss();
    root.layout();
    System.out.println(label.getWidth());

    primaryStage.setScene(scene);
    primaryStage.show();

}

作为输出:17.818359375

注意我已为HBox更改Group,因为:

  

一个小组将"自动调整大小"在布局过程中将其可管理的可调整大小的子项设置为其首选大小,以确保区域和控件在其状态更改时的大小正确

如果您使用HBox,则还需要设置场景的尺寸:

@Override
public void start(Stage primaryStage) {
    HBox root = new HBox();
    Label label = new Label("foo");
    root.getChildren().add(label);
    Scene scene = new Scene(root,100,20);

    root.applyCss();
    root.layout();
    System.out.println(label.getWidth());

    primaryStage.setScene(scene);
    primaryStage.show();

}

现在输出为:18.0