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?
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.
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);
}
}
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);