2012-10-01 66 views
5

我想從Swing跳轉到JavaFX。但我找不到如何獲得節點的寬度和高度。獲取節點的維度 - JavaFX 2

所以,這裏有一些代碼。

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

回答

7

寬度和高度不被初始化,直到你把節點實際上放置在現場的容器,因爲他們可以根據容器的類型而改變。

嘗試下一個:

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); 
    } 
} 
+0

我編輯我的第一次因爲它仍然不適合我。我不知道如何在沒有編輯的情況下再次回覆我的文章,因爲這是我的第一篇文章。感謝您的幫助。 –

+0

出於同樣的原因。您在放置到場景之前調用'label.getWidth()'。我已經添加了更正的代碼示例。 –

+0

是的,我完全理解這背後的邏輯。謝謝謝爾蓋。 –

7

一旦節點添加到屏幕上,您可以使用:

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