IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Mise à jour de ListView sans avoir à appuyer sur un bouton (mise à jour automatique au démarrage)


Sujet :

JavaFX

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Mise à jour de ListView sans avoir à appuyer sur un bouton (mise à jour automatique au démarrage)
    Bonjour à toutes et à tous,

    Je créer un logiciel qui permet d'afficher des données dans des ListView. Mon problème : je n'arrive pas à afficher dès le lancement du logiciel ma ListView remplie.
    En fait la difficulté se situe au niveau de la modularité de ma ListView, je commence auparavant par récupérer des infos dans un fichier qui me serviront ensuite à remplir ma ListView.

    C'est ma méthode majListView() qui est incompatible avec le start, sauf que je ne vois pas d'autres moyens pour mettre à jour ma ListView dès le premier affichage.

    Je pense cerner mon problème, en fait le start n'a pas fini son exécution et donc mon instance FXML "public ListView<String> teamList;" qui se trouve dans le Controller n'a pas encore eu l'occasion de s'initialiser.
    Cela provoque l'exception : java.lang.NullPointerException en provenance de la ligne 9 "teamList.getItems().clear();" et donc aussi de la ligne "teamList.getItems().add(a);".

    La solution serait-elle de faire un timer, ou de chainer le start avec ma methode majListView() ? Bref je vous pose la question car cela me parait asser basique de mettre à jour mon logiciel à chaque fois que j'arrive sur la fenêtre en question et cependant je ne parviens pas à trouver de solution efficace.

    Je vous remercie d'avance pour votre aide.

    N'hésitez pas à me poser des questions si je ne suis pas clair.



    Dans le start j'ai ajouté une methode .majListView() qui récupère des information pour remplir ma ListView. La méthode se situe dans mon Controller.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public class MainECDL extends Application {
    	public void start(Stage primaryStage){
            try {
                Parent root = FXMLLoader.load(getClass().getResource("MainView.fxml"));
                primaryStage.setScene(new Scene(root));
    		} 
    		catch (Exception e) {
                e.printStackTrace();
            }
     
    		//initialisation de mon controller
    		Controller ct = new Controller();
     
    		//création de mon stage
            primaryStage.show();
     
    		//methode pour mettre à jour ma ListView
    		ct.majListView();
    	}
     
    	/* le main un peu plus loin 
    lance le logiciel */
    }


    Ma ListView est constitué de String et se prénome "teamList"
    j'ai un fichier nommé "autoCount.conf" dans le fichier utilisateur pour stocker mes informations.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public class Controllerone {
     
    	@FXML
        public ListView<String> teamList;
     
    	public void majListView() throws IOException {
     
    		//suppression des infos éventuellement présentes dans ma ListView
    		teamList.getItems().clear();
     
    		//récupération du fichier
    		String chaineInformation = new String(String.valueOf(Files.readAllLines(Paths.get(System.getProperty("user.dir") + "/autoCount.conf"))));
     
    		//met les infos une par une dans un tableau
    		String[] array = chaineInformation.split(", ");
     
    		//ajoute chaque élément du tableau dans la ListView
            for (String a: array) {
                teamList.getItems().add(a);
            } 
        }

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par anonime35 Voir le message
    Je pense cerner mon problème, en fait le start n'a pas fini son exécution et donc mon instance FXML "public ListView<String> teamList;" qui se trouve dans le Controller n'a pas encore eu l'occasion de s'initialiser.
    Cela provoque l'exception : java.lang.NullPointerException en provenance de la ligne 9 "teamList.getItems().clear();" et donc aussi de la ligne "teamList.getItems().add(a);".
    Non, ca a meme aucun rapport.

    Le soucis est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class MainECDL extends Application {
    Parent root = FXMLLoader.load(getClass().getResource("MainView.fxml"));
    [...]
    //initialisation de mon controller
    Controller ct = new Controller();
    [...]
    Tu crées manuellement une nouvelle instance de Controller qui est aucunement lie au FXML que tu viens de charger et donc forcement tout est null dedans quand tu invoques ta methode...

    Eviter aussi d'utiliser la variante statique de load() et préférer la variante d'instance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class MainECDL extends Application {
    final var loader = new FXMLLoader(getClass().getResource("MainView.fxml"));
    Parent root = loader.load();
    [...]
    //initialisation de mon controller
    Controller ct = (Controller)loader.getController();
    [...]
    PS : ce code fonctionne uniquement si tu controller est decrit dans ton FXML. Si ce n'est pas le cas il faut instancer le controller a mano, l'injecter dans le loader et puis invoquer load().
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 14/05/2014, 15h27
  2. [1.x] configuration sans avoir de droit sur php.ini/httpd.conf
    Par manu f dans le forum Symfony
    Réponses: 3
    Dernier message: 11/02/2010, 16h05
  3. Utilisation de Project avec VB6 sans avoir installer Project sur le PC (DLL?)
    Par bibiGN dans le forum Installation, Déploiement et Sécurité
    Réponses: 3
    Dernier message: 28/05/2009, 13h46
  4. Réponses: 14
    Dernier message: 13/05/2009, 16h49
  5. Réponses: 2
    Dernier message: 11/02/2007, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo