1

guys. I have to make toggle scenes in the one stage. Last one may be resized. So I meet the problem - active scene is not recalculate layout after setScene() called, only after resizing action of the Stage. Are there somebody know where is my mistake or it is Stage specific bug? here my code example

public class SceneToggle extends Application {
Stage primaryStage;
Scene scene1;
Scene scene2;
@Override
public void start(Stage _primaryStage) {
    primaryStage=_primaryStage;
    StackPane root1 = new StackPane();
    root1.getChildren().addAll(new Rectangle(0,0,100,100));
    scene1 = new Scene(root1,Color.RED);
    StackPane root2 = new StackPane();
    root2.getChildren().addAll(new Circle(0,0,50));
    scene2 = new Scene(root2,Color.GREEN);
    primaryStage.setScene(scene1);
    double screenWidth=200;
    double screenHeight=200;
    scene1.getRoot().scaleXProperty().bind(primaryStage.widthProperty().divide(screenWidth));
    scene1.getRoot().scaleYProperty().bind(primaryStage.heightProperty().divide(screenHeight));
    scene2.getRoot().scaleXProperty().bind(primaryStage.widthProperty().divide(screenWidth));
    scene2.getRoot().scaleYProperty().bind(primaryStage.heightProperty().divide(screenHeight));
    ObservableList<Screen> screens = Screen.getScreens();
    Rectangle2D primaryScreenBounds = screens.get((screens.size() > 1) ? 1 : 0).getBounds();
    primaryStage.setX(primaryScreenBounds.getMinX());
    primaryStage.setY(primaryScreenBounds.getMinY());
    primaryStage.setWidth(screenWidth);
    primaryStage.setHeight(screenHeight);
    primaryStage.setTitle("Scene togling");
    primaryStage.show();
    primaryStage.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent event) {
              if(primaryStage.getScene().equals(scene1)){
                  primaryStage.setScene(scene2);
              }else{
                  primaryStage.setScene(scene1);
              }

        }
    });
    /*scene1.getRoot().addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent event) {
            scene2.getRoot().setVisible(true);
            primaryStage.setScene(scene2);
            scene1.getRoot().setVisible(false);
        }
    });
    scene2.getRoot().addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent event) {
            scene1.getRoot().setVisible(true);
            primaryStage.setScene(scene1);
            scene2.getRoot().setVisible(false);
        }
    });*/
    /*scene1.getRoot().addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent event) {
            scene2.getRoot().setVisible(true);
            primaryStage.setScene(scene2);
            scene1.getRoot().setVisible(false);
        }
    });
    scene2.getRoot().addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent event) {
            scene1.getRoot().setVisible(true);
            primaryStage.setScene(scene1);
            scene2.getRoot().setVisible(false);
        }
    });*/
}

/**
 * The main() method is ignored in correctly deployed JavaFX application.
 * main() serves only as fallback in case the application can not be
 * launched through deployment artifacts, e.g., in IDEs with limited FX
 * support. NetBeans ignores main().
 *
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

4

0 回答 0