web-dev-qa-db-fra.com

Définir la hauteur et la largeur de la scène et de la scène dans javafx

  • Je développe une application javafx.
  • Dans ma candidature, il y a deux scènes et une scène.
  • En application, la hauteur et la largeur des deux scènes sont identiques ou constantes.
  • ainsi, selon mes recherches, la hauteur et la largeur de la scène restent constantes, ce qui est mentionné dans le constructeur, mais la scène s'ajuste avec la hauteur et la largeur de la scène.
  • lorsque je déjeune avec une hauteur et une largeur de scène différentes de la hauteur et de la largeur constantes de la scène, la scène s'ajuste avec la scène.
  • mais quand au moment de l'exécution quand j'applique la 2ème scène alors la scène n'est pas ajustée avec la hauteur et la largeur de la scène. la hauteur et la largeur de la scène restent constantes.

  • donc une solution?

13
Anvay

Si je comprends bien le problème ci-dessus affiché. Je pense que la scène est assez bonne pour définir la hauteur et la largeur préférées selon l'auditeur obtenir la nouvelle demande à appliquer sur la taille des fenêtres. Mais il a certaines limites, si vous maximisez ou minimisez l'écran javaFX et essayez de naviguer vers un autre écran, alors l'autre écran aura la même taille de fenêtre mais le contenu de la scène sera déformé dans la hauteur et la largeur par défaut de celui-ci, par exemple, prenez une connexion et la scène domestique dans javafx (toutes les scènes sont analysées avec fxml). Login.fxml est initialisé par son contrôleur. Comme vous l'avez mentionné, cette scène est initialisée dans le constructeur, elle doit donc être le contrôleur du fxml associé (à partir de maintenant FXML est étroitement couplé avec le contrôleur). Vous allez définir la taille de la scène (hauteur et largeur) dans le constructeur lui-même.

1.) LoginController pour login.fxml

 import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;

    import Java.io.IOException;

    class LoginController  {

        private Stage stage;
        private Scene scene;
        private Parent parent;
        @FXML  
        private Button gotoHomeButton;        

        public LoginController()  throws Exception {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/login.fxml"));
            fxmlLoader.setController(this);
            try {
                parent = (Parent) fxmlLoader.load();
                // set height and width here for this login scene
                scene = new Scene(parent, 1000, 800);
            } catch (IOException ex) {
                System.out.println("Error displaying login window");
                throw new RuntimeException(ex);
            }
        }

        // create a launcher method for this. Here I am going to take like below--
        public void launchLoginScene(Stage stage) {
           this.stage = stage;
            stage.setScene(scene);
            stage.setResizable(true);

            stage.widthProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
                    setCurrentWidthToStage(number2); 
                }
            });

            stage.heightProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
                    setCurrentHeightToStage(number2);
                }
            });

            //Don't forget to add below code in every controller
            stage.hide();
            stage.show();

        }

         @FXML
        public void authenticateUser(ActionEvent actionEvent) { 

        // write your logic to authenticate user


         // 
         new HomeController().displayHomeScreen(stage);

        } 

        private void setCurrentWidthToStage(Number number2) {
            stage.setWidth((double) number2);
        }

        private void setCurrentHeightToStage(Number number2) {
            stage.setHeight((double) number2);
        }
    }

2.) Idem pour HomeController -

public class HomeController {

    private Parent parent;
    private Stage stage;
    private Scene scene;


    public HomeController (){
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/home.fxml"));
        fxmlLoader.setController(this);
        try {
             parent = (Parent) fxmlLoader.load();
                // set height and width here for this home scene
                scene = new Scene(parent, 1000, 800);
        } catch (IOException e) {
         // manage the exception
        }
    }

    public void displayHomeScreen(Stage stage){
        this.stage = stage;
        stage.setScene(scene); 

        // Must write
        stage.hide()
        stage.show();
    }
}

3.) Classe principale

import javafx.application.Application;

import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        new LoginController().launchLoginScene(primaryStage);
    }


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

Essayez simplement de mettre Stage.hide () avant Stage.show () dans chaque contrôleur. J'espère que cela vous aidera.

7
shambhu

En effet, la scène adapte sa taille à la scène, sauf indication contraire explicite ...

Voici une solution:

stage.setScene(scene2);
stage.setHeight(1000);
stage.setWidth(1000);

Et un exemple d'application:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Test extends Application {

    @Override
    public void start(final Stage stage) throws Exception {

        AnchorPane anchor1 = new AnchorPane();
        final Scene scene1 = new Scene(anchor1, 250, 250);
        Button boton1 = new Button();
        anchor1.getChildren().add(boton1);

        AnchorPane anchor2 = new AnchorPane();
        final Scene scene2 = new Scene(anchor2, 500, 500);
        Button boton2 = new Button();
        anchor2.getChildren().add(boton2);

        boton2.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                stage.setScene(scene1);
                stage.setHeight(1000);
                stage.setWidth(1000);
            }
        });

        boton1.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                stage.setScene(scene2);
                stage.setHeight(1000);
                stage.setWidth(1000);
            }
        });
        stage.setScene(scene1);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
7
Magcus

Je sais que c'est un vieux sujet, mais ce (bug?) Persiste toujours dans Java7u75.

Je suis tombé sur le même problème ... la solution proposée par shambhu ci-dessus fonctionne, mais entraîne un effet de "changement de fenêtre" visible:

stage.hide();
stage.show();

J'ai trouvé que le code suivant résout le problème (obtient l'étape de "rafraîchir") sans aucun effet visible:

final boolean resizable = stage.isResizable();
stage.setResizable(!resizable);
stage.setResizable(resizable);
2
Yevgeny Krasik