Bonjour,

J'ai crée un programme graphique avec Swing. Il me permet d'afficher un tableau de valeurs. Ce tableau est de dimension 2, sa première colonne sert à indiquer les instants d'observation et la deuxième colonne reprend les mesures prises à ces instants.

Je voudrais améliorer l'application en proposant - dans un premier temps - de charger un fichier. Pour cela, j'utilise un JFileChooser afin de permettre à l'utilisateur de choisir son fichier.

Voici la structure d'un tel fichier (ici correspond à la fonction sinus entre -pi et pi):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Size 10
-3.1415927 4.641020666628482E-8
-2.443460988888889 -0.6427875820347647
-1.7453292777777778 -0.9848077485349589
-1.0471975666666666 -0.866025411519473
-0.3490658555555557 -0.34202014817137205
0.3490658555555557 0.34202014817137205
1.0471975666666666 0.866025411519473
1.745329277777778 0.9848077485349589
2.4434609888888885 0.642787582034765
3.1415927 -4.641020666628482E-8
La première ligne indique la taille du fichier (nombre de lignes suivantes). Ensuite, pour chaque ligne, on a d'abord l'instant de mesure, puis la mesure. Les deux nombres sont séparés par un espace.

Pour afficher ce tableau graphiquement, je dois prendre chaque ligne du fichier grâce à la méthode NextLine() de la classe Scanner. Pour chaque appel de cette méthode, je dois séparer les deux nombres (1 correspondant à l'instant d'observation, l'autre à la mesure) sans doute avec la méthode split de la classe String, les convertir en double(avec Double.parseDouble(String ...), puis créer mon tableau de dimension 2 (en fait, il est de type DataSetIF, mais c'est pas un prob à ce niveau là car j'ai déjà le constructeur qu'il faut pour créer mon tableau de dim2).


J'essaye d'employer la classe Scanner et pas les BufferedReaders, StringTokenizers,...

En clair: J'ai un fichier de type particulier que je veux lire afin de créer 2 tableaux de type double. Le premier tableau indique les instants de mesures, le 2ème les mesures prises à ces instants.

Dès que j'ai ces 2 tableaux, j'ai ce qu'il faut pour afficher le fichier graphiquement.


Voici le code de ma méthode "charger" que j'ai généré, mais il ne fonctionne pas
J'ai pourtant réfléchi pendant longtemps...

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
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
/**
     * Méthode permettant de charger un DataSet depuis un fichier dans le répertoire courant
     * en  utilisant le format défini par Walbot (.dat)
     * 
     * @pre: - 
     * @post: crée un nouveau DataSet dont les valeurs correspondent à celles se trouvant dans le fichier .dat
     * 
     */
 
 public static DataSetIF charger(String file){ 
 
    try{
 
     // DEBUT PARTIE GRAPHIQUE
 
 
      //création d'une fenêtre contenant une zone de texte pour afficher le fichier souhaité (c'est pas encore l'affichage dans la zone graphique!)
 
        JFrame frame = new JFrame("Contenu du fichier");
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        JTextArea texte = new JTextArea(20,30);
 
        //création du JFileChooser permettant de sélectionner un fichier de manière "interactive"
 
        JFileChooser chooser = new JFileChooser();
 
        //titre de la fenêtre générée par le JFileChooser
 
        chooser.setDialogTitle("Charger un graphe...");
 
        //statut du JFileChooser
 
        int status = chooser.showOpenDialog(null);  //Pops up an "Open File" file chooser dialog (par défaut, n'affiche rien: null!)
 
        //procédure si un fichier n'est sélectionné (approuvé):
 
        if(status!= JFileChooser.APPROVE_OPTION) texte.setText("Aucun fichier choisi");
 
        //dans les autres cas, on affiche le contenu du fichier dans la fenêtre ET dans la zone graphique
 
        else{ 
 
            File myfile = chooser.getSelectedFile();
            Scanner scan = new Scanner(myfile);
            String info = "";
            while(scan.hasNext()){
                 info += scan.nextLine() + "\n";    
 
//nextLine(): Advances this scanner past the current line and returns the input that was skipped. 
 
                }   
 
 //This method returns the rest of the current line, excluding any line separator at the end.
 
 //The position is set to the beginning of the next line. 
 
 
          texte.setText(info); 
 
          //combien de ligne y a t'il dans le fichier?
 
          int nblignes = scan.nextInt();
 
 
 
 
           //IL FAUT MAINTENANT CREER UN DATASETIF A PARTIR DU FICHIER
 
 
          String ligne = "";
          int indice = 0;
          String[] nombre = new String[2];
 
 
          double[] tab1 = new double[nblignes];  //tableau pour les instants de mesures
          double[] tab2 = new double[nblignes];  //tableau pour les mesures
 
 
          while(scan.hasNext()){
 
                ligne = scan.nextLine();  //on prend la ligne suivante du fichier
 
                nombre = ligne.split(" ");
 
                tab1[indice] = Double.parseDouble(nombre[0]);
                tab2[indice] = Double.parseDouble(nombre[1]);
 
                indice++;
 
        }//fin de while
 
 
        //création du DataSetIF
 
        DataSetIF mydata = new DataSet(tab1,tab2);
 
      //IL FAUT MAINTENANT CHARGER TOUT LE FICHIER DANS LA ZONE   GRAPHIQUE!
 
      JPlot j = new JPlot(mydata);
 
        }//fin de else
 
 
       //on ajoute la boite de texte au contenu de la petite fenêtre Jframe: le contenu du fichier (chiffres...) est affiché 
 
       frame.getContentPane().add(texte);
       frame.pack();
       frame.setVisible(true);
 
 
    }//fin de try 
 
    catch(IOException e){
 
        System.exit(-1);
 
        //traitement de l'exception de type IOException pouvant être lancée 
 
    }
 
    return mydata;
 
    }//fin de la méthode charger


Merci beaucoup pour votre aide!

Sébastien