我读了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();
}
}
答案 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