Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec JavaFx

Je n'arrive pas à chargé mon fichier fxml dans mon main

Sujet résolu
    9 mars 2023 à 20:41:19

    Je suis en train de coder une appli pour récupérer 3 champs et les mettre dans un fichier CSV mais je n'arrive plus à lancer pour tester mon code.

       MainApp:

    package com;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    
    public class MainApp extends Application {
        @Override
        public void start(Stage stage) throws Exception {
            Parent root = FXMLLoader.load(MainApp.class.getResource("form.fxml"));
            stage.setTitle("Salon Oenologique");
            stage.setScene(new Scene(root));
            stage.setResizable(false);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch();
        }
    }



    MainController

    package com;
    
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import java.io.*;
    import java.net.URL;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.util.ResourceBundle;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    public class MainController implements Initializable {
        @FXML
        private TextField nomField;
    
        @FXML
        private TextField prenomField;
    
        @FXML
        private TextField emailField;
    
        @FXML
        private Button enregistrerButton;
    
        @FXML
        private Label erreur;
    
        private boolean isValidEmailAddress(String email) {
            if (email == null || email.isEmpty()) {
                return false; // champ vide
            }
            // Expression régulière pour vérifier si la chaîne est une adresse email valide
            Pattern pattern = Pattern.compile("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}");
            Matcher matcher = pattern.matcher(email);
            return matcher.matches();
        }
    
        public void enregistrer() {
            String nom, prenom, email;
    
            try {
                // Récupérer les valeurs des champs de texte
                nom = nomField.getText();
                prenom = prenomField.getText();
                email = emailField.getText();
    
                // Valider l'adresse email
                if (!isValidEmailAddress(email)) {
                    erreur.setText("E-mail non valide");
                    throw new Exception("L'adresse email n'est pas valide");
                }
    
                // Enregistrer les données dans la base de données ou dans un fichier, etc.
                if (nom.isBlank()) {
                    erreur.setText("Le champ nom est vide");
                } else if (prenom.isBlank()) {
                    erreur.setText("Le champ prénom est vide");
                } else if (email.isBlank()) {
                    erreur.setText("Le champ e-mail est vide");
                } else {
                    // Enregistrer les données dans la base de données ou dans un fichier, etc.
                    enregistrerDansCSV(nom, prenom, email);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
        }
    
        private void enregistrerDansCSV(String nom, String prenom, String email) {
            try {
                // Obtenir la date et l'heure actuelles pour l'horodatage
                LocalDateTime currentTime = LocalDateTime.now();
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH-mm-ss");
                String datestamp = currentTime.format(formatter);
                String timestamp = currentTime.format(timeFormatter);
    
                String fileName  = getCSV();
    
                if (fileName != null) {
                    BufferedReader reader = new BufferedReader(new FileReader(fileName));
                    int nbLignes = 0;
                    while (reader.readLine() != null) nbLignes++;
                    reader.close();
                    // Ouvrir un flux de sortie pour écrire les données dans le fichier CSV
                    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true)); // true pour append
    
                    // Écrire les données de chaque champ de texte dans le fichier CSV
                    writer.write(nom + "," + prenom + "," + email + ","+ timestamp + "\n");
    
                    // Fermer le flux de sortie
                    writer.close();
                } else if (fileName == null) {
                    // Construire le nom de fichier avec l'horodatage
                    String newfile = "enregistrement_" + datestamp + ".csv";
                    BufferedWriter writer = new BufferedWriter(new FileWriter(newfile, true));
                    writer.write("Nom, Prenom, Email, Time\n");
                    writer.write(nom + "," + prenom + "," + email + "," + timestamp + "\n");
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                // Afficher un message d'erreur ou effectuer une autre action en réponse à l'erreur
            }
        }
    
        private String getCSV() {
            String csvFilename = null;
            try {
                // Récupérer le chemin absolu du répertoire contenant l'exécutable Java
                String currentDirectory = new File(".").getCanonicalPath();
    
                // Vérifier si le répertoire contient un fichier CSV
                File directory = new File(currentDirectory);
                File[] files = directory.listFiles();
                for (File file : files) {
                    if (file.isFile() && file.getName().endsWith(".csv")) {
                        csvFilename = file.getName();
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return csvFilename;
        }
    }

    form.fxml

    <?xml version="1.0" encoding="UTF-8"?>
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.Label?>
    <?import javafx.scene.control.TextField?>
    <?import javafx.scene.layout.HBox?>
    <?import javafx.scene.layout.VBox?>
    
    <VBox xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.MainController">
        <Label text="Nom" />
        <TextField fx:id="nomField" />
        <Label text="Prénom" />
        <TextField fx:id="prenomField" />
        <Label text="Adresse email" />
        <TextField fx:id="emailField" />
        <HBox>
            <Button text="Enregistrer" onAction="#enregistrer" fx:id="enregistrerButton"/>
            <Label fx:id="erreur"/>
        </HBox>
    </VBox>

    package

    module com{
        requires javafx.controls;
        requires javafx.fxml;
    
        requires com.dlsc.formsfx;
        requires org.kordamp.ikonli.javafx;
    
        opens com to javafx.fxml;
        exports com;

    et enfin la manière dont les fichiers sont arrangée.


    Je suis vraiment bloqué à cause de cette erreur. je suis sur que c'est surement bête mais je n'arrive pas à trouver le problème

    Merci de votre aide

    -
    Edité par MartinBiname 9 mars 2023 à 20:43:49

    • Partager sur Facebook
    • Partager sur Twitter
      10 mars 2023 à 8:26:22

      Que signifie "je n'arrive plus a lancer" ?
      • Partager sur Facebook
      • Partager sur Twitter
        10 mars 2023 à 9:30:38

        J'utilise intellJ pour programmer et j'obtiens une erreur comme quoi je ne fournir pas au Main le chemin du FXML et puis il s'arrête avec un code 1
        • Partager sur Facebook
        • Partager sur Twitter
          10 mars 2023 à 11:14:41

          est ce que  MainApp.class.getResource("form.fxml"est null?
          • Partager sur Facebook
          • Partager sur Twitter
            10 mars 2023 à 14:46:19

            J'obtiens ca comme erreur:

            Exception in Application start method
            java.lang.reflect.InvocationTargetException
            	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
            	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
            	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
            	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
            	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
            	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
            	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1082)
            Caused by: java.lang.RuntimeException: Exception in Application start method
            	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
            	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
            	at java.base/java.lang.Thread.run(Thread.java:833)
            Caused by: java.lang.NullPointerException: Location is required.
            	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3324)
            	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3287)
            	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3255)
            	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3227)
            	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3203)
            	at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3196)
            	at com.example.demo/com.MainApp.start(MainApp.java:15)
            	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
            	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
            	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
            	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
            	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
            	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
            	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
            	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
            	... 1 more
            Exception running application com.MainApp



            • Partager sur Facebook
            • Partager sur Twitter
              11 mars 2023 à 10:06:48

              intellJ me dis que getressource est externalement annoté comme nullable.

              Mais ca devrais pas posé de problème car ce bout de code est un template généré automatiquement par IntellJ lorsqu'on choisi un project JavaFX

              -
              Edité par MartinBiname 11 mars 2023 à 10:08:34

              • Partager sur Facebook
              • Partager sur Twitter
                11 mars 2023 à 20:39:02

                D'accord mais ce n'est toujours pas ma question.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 mars 2023 à 14:07:53

                  L'erreur me dis qu'il est null mais ça devrais pas être le cas
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mars 2023 à 14:48:55

                    Je me doute que ce n'est pas le resultat attendu, d'apres la doc de fonction getResource, quelle seraient les causes possible d'un retour null?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 mars 2023 à 8:41:29

                      Je pense que je vais reconstruire toute l'application car même lorsque j'ai redéplacé le code dans un nouveau project, rien ne fonctionne. Merci quand même P.X.L
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 juin 2023 à 16:27:50 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


                        Problème avec JavaFx

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown