2012-10-01 13 views
5

Estoy intentando saltar a JavaFX desde Swing. Pero no puedo encontrar cómo obtener el ancho y la altura de un nodo.Obtener la dimensión de un nodo - JavaFX 2

Por lo tanto, aquí hay un poco de código.

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

Los resultados son los siguientes:

-1.0 
0.0 
-1.0 
-1.0 

Lo mismo en Swing es:

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

Gracias


Después de editar:

¿Por qué esto no funciona para mí?

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

Respuesta

7

anchura y la altura no se inicializan hasta que coloque nodo en un recipiente colocado realmente en la escena, ya que pueden cambiar dependiendo del tipo de contenedor.

tratar a continuación:

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

En su código crea siguientes cambios:

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

edité mi primer publicar porque todavía no funciona para mí. No sé cómo responder a mi publicación nuevamente sin editarla, ya que es mi primera publicación aquí. Gracias por ayudar. –

+0

por la misma razón. Está llamando a 'label.getWidth()' antes de colocarla en escena. He agregado una muestra de código corregido. –

+0

Sí, entendí completamente la lógica detrás de esto. Gracias, Sergey. –

7

Una vez que se agrega el nodo a la pantalla se puede usar:

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