Reg Smith
Reg Smith

Reputation: 176

JavaFX Rectangle won't touch right side

I built a rectangle in JavaFX. My scene has a width of 300, my rectangle has a width of 80.

Rectangle.setX sets the placement of the Rectangle's top left corner. I setX to obScene.getWidth() - carRightSide and it doesn't touch the right side.

What am I doing wrong?

    package assign3;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Question4 extends Application
{

    public int carRightSide;

    @Override
    public void start( Stage obPrimeStage ) throws Exception
    {

        Pane obPane = new Pane();

        Circle obWheelOne = new Circle(20, Color.BLACK);
        obWheelOne.setRadius(20);
        Circle obWheelTwo = new Circle(20, Color.BLACK);
        obWheelTwo.setRadius(20);

        Rectangle obBody = new Rectangle(80, 40, Color.LIGHTBLUE);


        obPane.getChildren().add(obWheelOne);
        obPane.getChildren().add(obBody);

        Scene obScene = new Scene(obPane, 300, 350);

        carRightSide = 80;
        obBody.setX(obScene.getWidth() - carRightSide);
        obBody.setY(40);

        obPrimeStage.setTitle("Driving Cars");
        obPrimeStage.setScene(obScene);
        obPrimeStage.setResizable(false);
        obPrimeStage.show();


    }

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

    }

}

Upvotes: 0

Views: 275

Answers (1)

Jérôme
Jérôme

Reputation: 1254

You have to call obPrimeStage.show(); before you use the .getWidth()of the Scene.

public class Question4 extends Application
{

    public int carRightSide = 80;

    @Override
    public void start( Stage obPrimeStage ) throws Exception
    {

        Pane obPane = new Pane();           

        Scene obScene = new Scene(obPane, 300, 350, Color.ANTIQUEWHITE);
        obPrimeStage.setScene(obScene);//Add scene here
        obPrimeStage.setTitle("Driving Cars");
        obPrimeStage.setResizable(false);
        obPrimeStage.show();//Show Stage so that the size will be calculated

        Circle obWheelOne = new Circle(20, Color.BLACK);
        obWheelOne.setRadius(20);
        Circle obWheelTwo = new Circle(20, Color.BLACK);
        obWheelTwo.setRadius(20);

        Rectangle obBody = new Rectangle(carRightSide, 40, Color.LIGHTBLUE);
        obBody.setX(obScene.getWidth() - carRightSide);
        obBody.setY(40);

        obPane.getChildren().add(obBody);
        obPane.getChildren().add(obWheelOne);
        obPane.getChildren().add(obWheelTwo);
    }

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

or you can adjust the size of the Stage after setting the Scene

Scene obScene = new Scene(obPane, 300, 350, Color.ANTIQUEWHITE);
obPrimeStage.setScene(obScene);//Add scene here
obPrimeStage.setWidth(obScene.getWidth());
obPrimeStage.setHeight(obScene.getHeight());

//Circles
//Rectangle
//Adding components
obPrimeStage.setTitle("Driving Cars");
obPrimeStage.setResizable(false);
obPrimeStage.show();//Show Stage so that the size will be calculated

Upvotes: 1

Related Questions