获取节点的尺寸 - JavaFX 2

8

我正在尝试从Swing转向JavaFX。但是我找不到如何获取节点的宽度和高度。

下面是一些代码:

Label label = new Label();
label.setText("Hello");
label.setFont(new Font(32));

System.out.println(label.getPrefWidth());
System.out.println(label.getWidth());
System.out.println(label.getMinWidth());
System.out.println(label.getMaxWidth());

结果如下:
-1.0
 0.0
-1.0
-1.0

在Swing中,同样的事情是:

JComponent.getPreferredSize().width
JComponent.getPreferredSize().height

谢谢你


编辑之后:

为什么这对我不起作用?

public class Dimensions extends Application {

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

    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");

        primaryStage.setScene(new Scene(new MyPanel(), 500, 500));
        primaryStage.centerOnScreen();
        primaryStage.setResizable(false);
        primaryStage.show();
    }
}

public class MyPanel extends Pane {

    public MyPanel() {  
        Label label = new Label();
        label.setText("Hello");
        label.setFont(new Font(32));

        getChildren().add(label);

        label.relocate(150, 150);

        System.out.println(label.getWidth());
    }
}
2个回答

20

将节点添加到屏幕后,您可以使用以下方法:

thisNode.getBoundsInParent().getHeight(); //Returns height of object in parent container.

10

直到您将节点放入实际放置在场景中的容器中,宽度和高度才会初始化,因为它们可能根据容器类型而变化。

请尝试以下操作:

public void start(Stage primaryStage) {
    Label label = new Label();
    label.setText("Hello");
    label.setFont(Font.font("Arial", 32));

    System.out.println(label.getWidth());

    StackPane root = new StackPane();
    root.getChildren().add(label);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();

    System.out.println("------");
    System.out.println(label.getWidth());
}
在您的代码中做出以下更改:
public class Dimensions extends Application {

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

    public void start(Stage primaryStage) {
        MyPanel myPanel = new MyPanel();
        primaryStage.setScene(new Scene(myPanel, 500, 500));
        primaryStage.show();

        System.out.println(myPanel.label.getWidth());
    }
}

class MyPanel extends Pane {
    public Label label;

    public MyPanel() {

        label = new Label();
        label.setText("Hello");
        label.setFont(new Font(32));
        getChildren().add(label);
        label.relocate(150, 150);
    }
}

我编辑了我的第一篇帖子,因为它对我仍然没有用。我不知道如何回复我的帖子,除非编辑它,因为这是我在这里的第一篇帖子。谢谢你的帮助。 - Giannis Krimitzas
由于您在场景中放置标签之前调用了 label.getWidth(),因此出现了这种情况。我已经添加了更正后的代码示例。 - Sergey Grinev
是的,我完全理解这背后的逻辑。谢谢Sergey。 - Giannis Krimitzas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接