Kevin Jackson
Kevin Jackson

Reputation: 5

Get Pane size without adding it to a scene (in JavaFX)?

If I create a Pane (with nodes inside it), how can I compute the width/height without rendering it on-screen?

I am trying to create a document (in memory) and send it to a printer. The problem is that I need to compute how many pages and to do that I need to get the dimensions of the document.

A quick example I'm experimenting with:

Label testLabel1 = new Label("TEST1");
Label testLabel2 = new Label("TEST no. 2");
GridPane testGl = new GridPane();
testGl.add( testLabel1, 1, 1 );
testGl.add( testLabel2, 2, 2 );
VBox testVBox = new VBox( testGl );
Pane testPane = new Pane( testVBox );

//I read that this might be required
testPane.applyCss();
testPane.layout();

//Also that a delay is needed for the fx tread to update testPane
// (but shouldn't this all be in the same thread since it is in the same function?
// It doesn't seem to help).
Platform.runLater(  ()->{
    System.out.println( ">>> "+ testPane.getBoundsInLocal().getWidth() );
});

All I ever output is >>> 0.0. Note that in the program I'm developing, I have multiple Panes inside a "container" Pane. Hence, the variable testPane.

Thank you.

Upvotes: 0

Views: 1205

Answers (1)

fabian
fabian

Reputation: 82451

You need to add the Pane to a Scene for the layouting to work. There is no need to display the Scene however and there is no need to keep the Pane in this scene:

Label testLabel1 = new Label("TEST1");
Label testLabel2 = new Label("TEST no. 2");
GridPane testGl = new GridPane();
testGl.add(testLabel1, 1, 1);
testGl.add(testLabel2, 2, 2);
VBox testVBox = new VBox(testGl);
Pane testPane = new Pane(testVBox);

// add testPane to some scene before layouting
Scene testScene = new Scene(testPane);

testPane.applyCss();
testPane.layout();

System.out.println(">>> " + testPane.getBoundsInLocal().getWidth());

// Pane could be removed from scene
Group replacement = new Group();
testScene.setRoot(replacement);

Note that if you want to remove the root from a Scene you have to replace it with a non-null node.

Upvotes: 1

Related Questions