Bonjour à tous,
J'aimerai effectué lorsque j'appuie sur un bouton (Button()) l'action de m'ouvrir une autre IHM (dans une classe à coté) tout en fermant la fenêtre.
Dans la suite de mon explication je n'ai pas mis d'import mais il y sont ! 
Dans mon projet j'ai un package IHM :

mon MainIHM est la classe principale :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
public class MainIHM extends Application{
@Override
public void start(Stage stage) throws Exception {
Group root = new Group();
Scene scene = new Scene(root, 600, 500);
stage.setResizable(false);//empecher d'agrandir ou de réduire la fenêtre ainsi que de la resize comme on le veut
//scene.setFill(Color.RED);
//Text text = new Text(10, 30, "Hello World!");
//root.getChildren().add(text);
ClientAuth ca = new ClientAuth();
root.getChildren().add(ca);
stage.setTitle("Sign in");
scene.setFill(Color.ALICEBLUE);
stage.setScene(scene);
stage.show();
//si le bouton créer un compte est appuyé
//ClientAccount cac = new ClientAccount();
// root.getChildren().add(cac);
//stage.setTitle("Sign up");
//scene.setFill(Color.ALICEBLUE);
//stage.setScene(scene);
//stage.show();
//if connecté
//ClientPanel cp = new ClientPanel();
//root.getChildren().add(cp);
//stage.setHeight(500);
//stage.setWidth(600);
// stage.setTitle("Messagerie");
//stage.setScene(scene);
//stage.show();
}
public static void main(String[] args) {
Application.launch(MainIHM.class, args);
}
} |
Vous voyez qu'ici j'ai mis en commentaires les fenêtres ClientAccount et ClientPanel qui ne s'ouvriront donc pas car pour le moment étant donner que je n'est pas réussi à les séparer lorsque je lance mon programme ces 3 fenêtres que j'aimerai distinguer l'une de l'autre sont pour le moment regrouper en une seul et ce n'est pas ce que je souhaite.
J'ouvre ici en premier temps l'IHM ClientAuth (IHM d'authentification par un utilisateur)
La classe ClientAuth = (extend de Parent car j'utilise JavaFx)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
public class ClientAuth extends Parent{
private TextField textToSendNdc;// Zone de texte permettant de saisir le nom de compte
private PasswordField textToSendMdp;
private Button sendBtn;
private Button sendCompte;
private Text textWelcome;
private Text textConnection;
private Text textPseudo;
private Text textPassword;
private Text textCompte;
final Font times30BoldItalicFont = Font.font("arial", FontWeight.BOLD, FontPosture.ITALIC, 30);
final Font times20ItalicFont = Font.font("arial", FontPosture.ITALIC, 20);
final Font times15ItalicFont = Font.font("arial", FontPosture.ITALIC, 15);
public ClientAuth(){
textWelcome = new Text();
textWelcome.setText("Bienvenue sur l'IRC");
textWelcome.setLayoutX(175);
textWelcome.setLayoutY(80);
textWelcome.setFont(times30BoldItalicFont);
textConnection = new Text();
textConnection.setText("Connectez-vous :");
textConnection.setLayoutX(225);
textConnection.setLayoutY(130);
textConnection.setFont(times20ItalicFont);
textPseudo = new Text();
textPseudo.setText("Nom de compte :");
textPseudo.setLayoutX(150);
textPseudo.setLayoutY(185);
textPseudo.setFont(times15ItalicFont);
textPassword= new Text();
textPassword.setText("Mot de passe :");
textPassword.setLayoutX(150);
textPassword.setLayoutY(275);
textPassword.setFont(times15ItalicFont);
textToSendNdc = new TextField();
textToSendNdc.setLayoutX(150);
textToSendNdc.setLayoutY(190);
textToSendNdc.setPrefHeight(10);
textToSendNdc.setPrefWidth(300);
textToSendNdc.setEditable(true);
textToSendNdc.clear();
textToSendMdp = new PasswordField();
textToSendMdp.setLayoutX(150);
textToSendMdp.setLayoutY(280);
textToSendMdp.setPrefHeight(10);
textToSendMdp.setPrefWidth(300);
textToSendMdp.setEditable(true);
textToSendMdp.clear();
sendBtn= new Button();
sendBtn.setText("Connexion");
sendBtn.setLayoutX(250);
sendBtn.setLayoutY(330);
sendBtn.setPrefWidth(100);
sendBtn.setPrefHeight(50);
sendBtn.setVisible(true);
sendBtn.setTextFill(Color.DARKGREEN);
/* sendBtn.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {
Label label = new Label();
if (textToSend.getText().isEmpty() ){
} else {
label.setText(textToSend.getText()+"\n");
label.setPrefWidth(400);
receivedText.getChildren().add(label);
textToSend.setText("");
}
});*/
sendCompte= new Button();
sendCompte.setText("Créer un compte");
sendCompte.setLayoutX(230);
sendCompte.setLayoutY(430);
sendCompte.setPrefWidth(140);
sendCompte.setPrefHeight(40);
sendCompte.setVisible(true);
sendCompte.setTextFill(Color.DARKCYAN);
sendCompte.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {
//si le bouton créer un compte est appuyé
ClientAccount cac = new ClientAccount();
}
});
/* sendBtn.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {
Label label = new Label();
if (textToSend.getText().isEmpty() ){
} else {
label.setText(textToSend.getText()+"\n");
label.setPrefWidth(400);
receivedText.getChildren().add(label);
textToSend.setText("");
}
});*/
textCompte = new Text();
textCompte.setText("ou");
textCompte.setLayoutX(290);
textCompte.setLayoutY(420);
textCompte.setFont(times15ItalicFont);
this.getChildren().add(textToSendNdc);
this.getChildren().add(textToSendMdp);
this.getChildren().add(textWelcome);
this.getChildren().add(textConnection);
this.getChildren().add(textPseudo);
this.getChildren().add(textPassword);
this.getChildren().add(sendBtn);
this.getChildren().add(textCompte);
this.getChildren().add(sendCompte);
}
} |
Je définie mes boutons, je réalise mon interface tous se passe bien, mais je bloque ici car j'aimerai faire en sorte d'ouvrir ClientAccout mon IHM de création de compte lorsque je clique sur le bouton "Créer un compte".
La classe que je souhaite ouvrir : ClientAccount() dans l'évenement de l'appuie sur le bouton de création de compte de la classe ClientAuth().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
public class ClientAccount extends Parent{
private TextField textToSendNdc;// Zone de texte permettant de saisir le nom de compte
private PasswordField textToSendMdp;
private PasswordField textToSendMdpRepeat;
private Button sendBtn;
private Button sendCompte;
private Text textWelcome;
private Text textPseudo;
private Text textPassword;
private Text textRepeatPassword;
private Text textCompte;
final Font times30BoldItalicFont = Font.font("arial", FontWeight.BOLD, FontPosture.ITALIC, 30);
final Font times20ItalicFont = Font.font("arial", FontPosture.ITALIC, 20);
final Font times15ItalicFont = Font.font("arial", FontPosture.ITALIC, 15);
public ClientAccount(){
textWelcome = new Text();
textWelcome.setText("Création de votre compte :");
textWelcome.setLayoutX(130);
textWelcome.setLayoutY(60);
textWelcome.setFont(times30BoldItalicFont);
textPseudo = new Text();
textPseudo.setText("Saisir un pseudo :");
textPseudo.setLayoutX(150);
textPseudo.setLayoutY(145);
textPseudo.setFont(times15ItalicFont);
textPassword= new Text();
textPassword.setText("Saisir un mot de passe :");
textPassword.setLayoutX(150);
textPassword.setLayoutY(230);
textPassword.setFont(times15ItalicFont);
textRepeatPassword= new Text();
textRepeatPassword.setText("Retapez le mot de passe :");
textRepeatPassword.setLayoutX(150);
textRepeatPassword.setLayoutY(280);
textRepeatPassword.setFont(times15ItalicFont);
textToSendNdc = new TextField();
textToSendNdc.setLayoutX(150);
textToSendNdc.setLayoutY(150);
textToSendNdc.setPrefHeight(10);
textToSendNdc.setPrefWidth(300);
textToSendNdc.setEditable(true);
textToSendNdc.clear();
textToSendNdc.selectionProperty().addListener(observable -> System.out.println("Sélection modifiée dans le champ d'édition !"));
textToSendNdc.copy();
//textToSendNdc.setDocument(new TStringField(10));
TextFormatter<?> integerOnlyFormatter = null;
textToSendNdc.setTextFormatter(integerOnlyFormatter); /*le filtrage des modifications apportées au contenu du contrôle de saisie (
ex. : éviter la saisie de certains caractères); convertir le texte saisi dans le contrôle par l'utilisateur en une valeur de type V
qui sera contenue dans la propriété value du formateur. Dans le cas où le programmeur modifie la propriété value du formateur,
celui-ci convertira alors la valeur en texte à afficher dans le contrôle de saisie.*/
/* final UnaryOperator<TextFormatter.Change> integerOnlyFilter = change -> {
final String text = change.getText();
return (text.isEmpty() || text .matches("[0-9]")) ? change : null;
};
final TextFormatter<Integer> integerOnlyFormatter = new TextFormatter(integerOnlyFilter);*/
textToSendMdp = new PasswordField();
textToSendMdp.setLayoutX(150);
textToSendMdp.setLayoutY(235);
textToSendMdp.setPrefHeight(10);
textToSendMdp.setPrefWidth(300);
textToSendMdp.setEditable(true);
textToSendMdp.clear();
final PasswordField passwordField = new PasswordField();
passwordField.setPromptText("Mot de passe");
passwordField.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
// Validation du mot de passe.
// Réaction en cas de mot de passe valide.
// Réaction en cas de mot de passe non valide.
passwordField.clear();
}
});
textToSendMdpRepeat = new PasswordField();
textToSendMdpRepeat.setLayoutX(150);
textToSendMdpRepeat.setLayoutY(285);
textToSendMdpRepeat.setPrefHeight(10);
textToSendMdpRepeat.setPrefWidth(300);
textToSendMdpRepeat.setEditable(true);
textToSendMdpRepeat.clear();
sendBtn= new Button();
sendBtn.setText("Création du compte");
sendBtn.setLayoutX(150);
sendBtn.setLayoutY(350);
sendBtn.setPrefWidth(140);
sendBtn.setPrefHeight(50);
sendBtn.setVisible(true);
sendBtn.setTextFill(Color.DARKGREEN);
sendBtn.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {
System.out.println("test");
}
});
sendCompte = new Button();
sendCompte.setText("Menu connexion");
sendCompte.setLayoutX(310);
sendCompte.setLayoutY(350);
sendCompte.setPrefWidth(140);
sendCompte.setPrefHeight(50);
sendCompte.setVisible(true);
sendCompte.setTextFill(Color.DARKCYAN);
/* sendBtn.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {
Label label = new Label();
if (textToSend.getText().isEmpty() ){
} else {
label.setText(textToSend.getText()+"\n");
label.setPrefWidth(400);
receivedText.getChildren().add(label);
textToSend.setText("");
}
});*/
this.getChildren().add(textToSendNdc);
this.getChildren().add(textToSendMdp);
this.getChildren().add(textToSendMdpRepeat);
this.getChildren().add(textWelcome);
this.getChildren().add(textPseudo);
this.getChildren().add(textPassword);
this.getChildren().add(textRepeatPassword);
this.getChildren().add(sendBtn);
this.getChildren().add(sendCompte);
}
} |
Voilà j'ai fournie toutes les classes, ClientPanel n'est pas nécessaire.
Pour résoudre mon problème j'avai penser à ajouter un if dans le mainIHM est ne lancer le ClientAccout que si le bouton de ClientAuth est appuyé, mais je ne sais pas si c'est faisable en Java le fait d'appeler un bouton défini dans une méthode d'une autre classe(ClientAuth) (qui plus est pour appeler une méthode d'une autre classe(ClientAccount)).
Ne sachant pas si c'était faisable, je suis passer sur la solution classique, c'est à dire agir sur l'ActionEvent du bouton
sendCompte.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {}
J'ai commencer à ajouter l'appel a la classe ClientAccout() mais la encore j'ai bloqué.
1 2 3 4 5 6 7 8 9 10 11 12
|
ClientAccount cac = new ClientAccount();
root.getChildren().add(cac);
stage.setTitle("Sign up");
scene.setFill(Color.ALICEBLUE);
stage.setScene(scene);
stage.show(); |
Je ne peut pas utiliser le paramètre stage qui est défini comme attribut Stage stage dans la création de la méthode de la classe MainIHM
public void start(Stage stage) throws Exception {
Puis si j'implémente comme sa dans mon ActionEvent je ne créer pas la scene car elle se créer au début du MainIHM mais pour le premier IHM pas pour le second.
Bref je suis complétement bloquer, je sais qu'il y a une solution mais je ne sais pas comment faire. Pouvez vous m'aider ?:p Merci beaucoup, vraiment merci d'avance. 
Je rappel que l'utilisation de JavaFX est une contrainte dans mon projet, merci si possible de me donner une solution sans contourner JavaFx.
Partager