Hello
J'ai donc regardé ton code et j'ai trouvé/résolu les erreurs.
Pour la majorité il y a bcp de confusion entre variables locales et membres d'une classe.
Je prend un exemple :
Ta classe MaFenetre déclare un membre
ToutesLesVilles maroc
Or dans ton constructeur MaFenetre tu redéclares maroc comme ceci :
ToutesLesVilles maroc=new ToutesLesVilles();
La bonne solution est de faire :
maroc=new ToutesLesVilles();
Conclusion dans ton cas : le membre maroc de Mafenetre ne sera jamais initialisé et restera à null.
Ce qui est plutot facheux pour la suite puisque quand tu changes un item
de ton combobox tu fais appel a ce bout de code :
pcentre.setVilleSelectionnee(maroc.getVilleParNom(texte));
maroc n'étant pas initialisé bim : nullPointerException
J'ai relevé les mêmes problèmes dans ta classe ToutesLesVilles avec les membres nb et tville.
Après il y a une autre "astuce" dans ton code : tu ajoutes le listener du combobox qui sélectionne les villes avant de déclarer la variable pcentre,
du coup a l'initialisation pcentre n'est pas initialisé et le code :
pcentre.setVilleSelectionnee(maroc.getVilleParNom(texte));
va péter une nullPointerException puisque pcentre est null.
Dans ce cas : c est crasseux mais ce n'est pas dramatique puisque cette erreur ne survient qu'une fois, la bonne solution consiste a déplacer l'init
de pcentre avant l'ajout du listener du combobox
Et pour finir je te poste ici les deux fichiers que j'ai corrigé :
import java.awt.Point;
import java.awt.Rectangle;
import java.util.*; //pour StringTokenizer
public class ToutesLesVilles{
private String nom;
private int nb,code, longitude,latitude;
private Ville[] tville;
private Ville ville;
private Route[] routes;
public Ville[] charger(String fichier){
FileTableau ft= new FileTableau(fichier);//chargement du fichier en créant un FileTableau
nb=ft.getSize();
System.out.println("nombre de ville dans le fichier ville.txt: "+nb);
tville= new Ville[nb];//déclaration d'un tableau contenant des objets ville
for(int i=0;i<nb;i++)
{
String lignelue= ft.getLine(i);
StringTokenizer st= new StringTokenizer(lignelue,";");
while (st.hasMoreTokens()) {
nom=st.nextToken();
code=Integer.parseInt(st.nextToken());
longitude=Integer.parseInt(st.nextToken());
latitude=Integer.parseInt(st.nextToken());
tville[i]= new Ville(nom,code,longitude,latitude);
}
}
return tville;
}
public Ville[] getTville() {
return tville;
}
public void chargerRoute(String fichier){
FileTableau ft = new FileTableau(fichier);
Route[] routes = new Route[ft.getSize()];
int r = 0;
for (int i = 0; i < ft.getSize(); i++)
{
String lignelue = ft.getLine(i);
StringTokenizer st = new StringTokenizer(lignelue, ";");
int villeA = Integer.parseInt(st.nextToken());
int villeB = Integer.parseInt(st.nextToken());
int distance = Integer.parseInt(st.nextToken());
System.out.println((1 + i) + "/" + ft.getSize());
Ville vilA = null;
Ville vilB = null;
int j = 0;
while ((vilA == null || vilB == null) && j < tville.length)
{
if (tville[j].getCode() == villeA)
{
vilA = tville[j];
}
else if (tville[j].getCode() == villeB)
{
vilB = tville[j];
}
j++;
}
}
}
public Ville getVilleParNom(String nomVille){
int i = 0;
boolean trouve = false;
while(! trouve && i < nb) {
if (tville[i].getNom().equalsIgnoreCase(nomVille))
return new Ville(tville[i].getNom(),tville[i].getCode(),tville[i].getLongitude(),tville[i].getLatitude());
else
i++;
}
return null;
}
public Ville getVilleParPosition(int x, int y)
{
for (int i = 0; i < tville.length; i++)
{
Rectangle rec = new Rectangle(tville[i].getLatitude(),tville[i].getLongitude(),4,4);
if (rec.contains(new Point(x,y)))
return tville[i];
}
return null;
}
}
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Mafenetre extends JFrame implements ActionListener, ItemListener{
//la barre de menus
JMenuBar br = new JMenuBar();
// Déclaration des menus
JMenu F = new JMenu("Fichier");
JMenu E = new JMenu("Help");
JMenu A = new JMenu("Affichage");
//Declarations des items de menus
JMenuItem A_C = new JMenuItem("Afficher les informations d une ville");
JMenuItem Q = new JMenuItem("Quitter");
JMenuItem C_A = new JMenuItem("Centre d aide");
JMenuItem A_P = new JMenuItem("A propos du logiciel");
JMenuItem C_C = new JMenuItem("Couleur de fond");
//déclaration de panels
private Carte pcentre;
JPanel pest = new JPanel();
JPanel pestn = new JPanel();
JPanel pestc = new JPanel();
JPanel psud = new JPanel();
JPanel pnord = new JPanel();
JPanel pnord1 = new JPanel();
JComboBox cb = new JComboBox();
JComboBox cc = new JComboBox();
public static final String[] nomcombo = {"dont le nom est","dont le code postale est"};
JComboBox crech = new JComboBox(nomcombo);
JLabel lvdep = new JLabel("Ville de départ");
JLabel lvar = new JLabel("Ville d'arrivée");
JLabel lval = new JLabel("Valider");
JLabel ldist = new JLabel("Distance :");
JLabel ltemp = new JLabel("Temps :");
JLabel lvp = new JLabel("Ville Proche:");
JLabel lrech = new JLabel("Recherche d'une ville");
JLabel nomv = new JLabel("Nom ville");
JLabel cdp = new JLabel("Code postal");
JTextField trech = new JTextField(20);
JTextField ldistr= new JTextField(10);
JTextField ltempr= new JTextField(10);
JTextField nomvr = new JTextField(10);
JTextField cdpr = new JTextField(10);
//JButton rech = new JButton("rechercher");
JButton bok = new JButton("OK");
JButton brech = new JButton("Rechercher");
private Ville[] t;
private ToutesLesVilles maroc;
public Mafenetre()
{
//Parametre de la fenetre, titre, taille, dimension
this.setTitle("Réalisation d'un Maroc Routier");
this.setSize(1024,768);
this.setLayout(new BorderLayout(15,10));
ldistr.setEditable(false);
ltempr.setEditable(false);
//nomvr.setEditable(false);
//cdpr.setEditable(false);
maroc=new ToutesLesVilles();
t=maroc.charger("C:/MyAtlas/Villes.txt");
for(int i=0; i < t.length; i++)
{
try{
cb.addItem(t[i].getNom());
cc.addItem(t[i].getNom());
}
catch(Exception a)
{ }
}
pcentre = new Carte(maroc);
//Ecouteur sur le combobox
cb.addItemListener(this);
//Ecouteur pour sortir de l application
Q.addActionListener(this);
//Ecouteur dans le menu affichage
C_C.addActionListener(this);
C_C.setToolTipText("Changer la couleur de fond");
//Ecouteur sur le menu afficher les infos d une ville
A_C.addActionListener(this);
//ecouteur sur A_P
A_P.addActionListener(this);
//Ajout des items sur le menu fichier
F.add(A_C);
F.add(Q);
//Ajout des items sur le menu aide
E.add(C_A);
E.add(A_P);
//Ajout d un item sur le menu affichage
A.add(C_C);
//Ajout des menus : fichier et help sur la barre de menus
br.add(F);
br.add(A);
br.add(E);
//mettre la barre de menus sur la frame
this.setJMenuBar(br);
//Proprieté de la frame une qui va contenir la carte
//pcentre.setBackground(Color.red);
//Proprietés de la frame trois qui va contenir nos 2 labels avec les noms des réalisateurs et de l encadrant
psud.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Choix"));
psud.setLayout(new BoxLayout(psud,BoxLayout.X_AXIS));
psud.add(Box.createHorizontalStrut(20));
psud.add(lvdep);
psud.add(Box.createHorizontalStrut(10));
psud.add(cb);
psud.add(Box.createHorizontalStrut(20));
psud.add(lvar);
psud.add(Box.createHorizontalStrut(10));
psud.add(cc);
psud.add(Box.createHorizontalStrut(20));
psud.add(bok);
//panel nord
pnord.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Rechercher une ville"));
pnord.setLayout(new BorderLayout());
pnord.add(pnord1, BorderLayout.CENTER);
pnord.setToolTipText("Rechercher une ville sur la carte");
//panel nord 1 qui contient la zone de recherche
//pnord1.setLayout(new BoxLayout(pnord1,BoxLayout.X_AXIS));
pnord1.add(lrech);
pnord1.add(Box.createHorizontalStrut(1));
pnord1.add(crech);
pnord1.add(trech);
pnord1.add(brech);
//panel est
pest.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Resultat"));
pest.setLayout(new BorderLayout());
//panel est nord
pestn.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gbc.insets = new Insets(10, 15, 0, 0);
pestn.add(ldist, gbc);
gbc.gridx =1;
gbc.gridy =0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gbc.insets = new Insets(10, 15, 0, 0);
pestn.add(ldistr, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gbc.insets = new Insets(10, 15, 0, 0);
pestn.add(ltemp, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gbc.insets = new Insets(10, 15, 0, 0);
pestn.add(ltempr, gbc);
//panel est centre
pestc.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Infos sur ville"));
pestc.setLayout(new GridBagLayout());
GridBagConstraints gbcd = new GridBagConstraints();
gbcd.gridx = gbc.gridy = 0;
gbcd.gridwidth = 1;
gbcd.gridheight = 1;
gbcd.weightx = 0;
gbcd.weighty = 0;
gbcd.insets = new Insets(10, 15, 0, 0);
pestc.add(nomv, gbcd);
gbcd.gridx =1;
gbcd.gridy =0;
gbcd.gridwidth = 1;
gbcd.gridheight = 1;
gbcd.weightx = 0;
gbcd.weighty = 0;
gbcd.insets = new Insets(10, 15, 0, 0);
pestc.add(nomvr, gbcd);
gbcd.gridx = 0;
gbcd.gridy = 1;
gbcd.gridwidth = 1;
gbcd.gridheight = 1;
gbcd.weightx = 0;
gbcd.weighty = 0;
gbcd.insets = new Insets(10, 15, 0, 0);
pestc.add(cdp, gbcd);
gbcd.gridx = 1;
gbcd.gridy = 1;
gbcd.gridwidth = 1;
gbcd.gridheight = 1;
gbcd.weightx = 0;
gbcd.weighty = 0;
gbcd.insets = new Insets(10, 15, 0, 0);
pestc.add(cdpr, gbcd);
pest.add(pestn, BorderLayout.NORTH);
pest.add(pestc, BorderLayout.CENTER);
//Ajouter nos panels sur la frame
this.add(pcentre,BorderLayout.CENTER);
this.add(pest,BorderLayout.EAST);
this.add(psud,BorderLayout.SOUTH);
this.add(pnord,BorderLayout.NORTH);
}
public void itemStateChanged(ItemEvent e){
if(e.getStateChange() == ItemEvent.SELECTED){
String texte = (String)cb.getSelectedItem();
try{
pcentre.setVilleSelectionnee(maroc.getVilleParNom(texte));
pcentre.updateUI();
}
catch(Exception e1){
e1.printStackTrace();
}
}}
public void actionPerformed(ActionEvent argo) {
//Object source = argo.getSource();
//int source = JFrame.EXIT_ON_CLOSE;
if(argo.getSource() == Q)
{
int result = JOptionPane.showConfirmDialog(pcentre,"Voulez vous vraiment quittez l application","Quitter application",JOptionPane.YES_NO_OPTION);
if(result == JOptionPane.YES_OPTION) System.exit(0);
}
if(argo.getSource() == C_C)
{
Color color = JColorChooser.showDialog(this,"Choix d'une couleur",Color.RED);
pnord1.setBackground(color);
pnord.setBackground(color);
psud.setBackground(color);
pest.setBackground(color);
pestn.setBackground(color);
pestc.setBackground(color);
}
if(argo.getSource() == A_C)
{
String string = JOptionPane.showInputDialog(null, "Entrez le nom de la ville") ;
int rep = 0;
if( string != null)
{
//System.out.println ("vous avez tapez:"+ string);
for(int i=0; i<t.length; i++){
if(t[i].getNom().equalsIgnoreCase(string)){
System.out.println ("vous avez tapez:"+ string);
System.out.println(+ t[i].getCode());
nomvr.setText(t[i].getNom());
//cdpr.setText(String(t[i].getCode()));
}
/* if (t[i].getNom() != string){
JOptionPane.showMessageDialog(this, "Entrer une ville");
string = JOptionPane.showInputDialog(null, "Entrez le nom de la ville") ;
}*/
}
}
}
if(argo.getSource() == brech)
{
for(int i = 0; i<t.length;i++){
if(trech.getText().equals(t[i].getNom()))
System.out.println("vous avez choisi"+ trech.getText());}
}
}
}
Tu n'auras qua remettre correctement les chemins des fichiers "villes" et "routes"
Bonne chance,
Niroken
Hello
J'ai donc regardé ton code et j'ai trouvé/résolu les erreurs.
Pour la majorité il y a bcp de confusion entre variables locales et membres d'une classe.
Je prend un exemple :
Ta classe MaFenetre déclare un membre
Or dans ton constructeur MaFenetre tu redéclares maroc comme ceci :
La bonne solution est de faire :
Conclusion dans ton cas : le membre maroc de Mafenetre ne sera jamais initialisé et restera à null.
Ce qui est plutot facheux pour la suite puisque quand tu changes un item
de ton combobox tu fais appel a ce bout de code :
maroc n'étant pas initialisé bim : nullPointerException
J'ai relevé les mêmes problèmes dans ta classe ToutesLesVilles avec les membres nb et tville.
Après il y a une autre "astuce" dans ton code : tu ajoutes le listener du combobox qui sélectionne les villes avant de déclarer la variable pcentre,
du coup a l'initialisation pcentre n'est pas initialisé et le code :
va péter une nullPointerException puisque pcentre est null.
Dans ce cas : c est crasseux mais ce n'est pas dramatique puisque cette erreur ne survient qu'une fois, la bonne solution consiste a déplacer l'init
de pcentre avant l'ajout du listener du combobox
Et pour finir je te poste ici les deux fichiers que j'ai corrigé :
Tu n'auras qua remettre correctement les chemins des fichiers "villes" et "routes"
Bonne chance,
Niroken