voici l énnoncé de mon projet:
Projet de Java: Conception d'un atlas routier
Vous allez dans ce projet écrire une application permettant de calculer et de visualiser sur une carte un itinéraire entre deux villes de France, calculer des itinéraire optimum en temps ou en consommation d'essence, etc...
Les fichiers nécéssaire à ce projet sont les suivants: FileTableau.class, ville.txt, route.txt
Etape 1: Chargement des données
Les données nécéssaires à votre application sont stockées dans des fichiers. Dans un premier temps, nous allons nous intérésser au fichier "ville.dat", qui contient les informations concernant les villes elle-mêmes. Le fichier contient une ligne pour chaque ville enregistrée.
Chaque ligne est construite ainsi: il y a quatre champs, le premier est le nom de la ville, le second son code, le troisième et le quatrième ses coordonnées. Les coordonnées sont fournies en km, et se situent donc entre 0 et 1000. Les champs sont séparés par des ";". Voici un extrait de ce fichier:
Lille;7;617;50
Nice;50;958;797
...
Vous pouvez éditer directement ce fichier dans DrJava ou WordPad pour voir son contenu.
Pour modéliser l'ensemble de nos villes, vous allez écrire deux classes:
La classe Ville, qui contient les données relatives à une ville (nom, code, coordonnées)
La classe Monde, qui contient l'ensemble de toutes les villes. La classe Monde doit posséder un tableau de villes et une méthode:
public void charger(String fichier)
dont le rôle est de remplir le tableau avec les données contenues dans le fichier passé en paramètre (qui sera "ville.dat" dans notre cas).
Pour écrire la méthode "charger", vous avez besoin des outils suivants:
La classe TextFile, qui vous permet de charger un fichier dans un tableau de Strings. Le fichier se charge en créant un objet TextFile ainsi:
TextFile tf = new TextFile("ville.dat");
tf contient alors l'ensemble des lignes du fichier "ville.dat". Cet ensemble peut être interrogé par deux méthodes de la classe TextFile: void getSize() qui renvoie le nombre de ligne, et String getLine(int i) qui renvoie la String correspondant à la ième ligne (à partir de 0).
La classe StringTokenizer, qui va vous permettre d'extraire chacun des champs de la ligne. Vous consulterez la documentation en ligne de Java pour apprendre à vous en servir.
La fonction Integer.parseInt(String s) qui vous permettra de convertir les Strings obtenues en entiers, si besoin est.
Une fois la classe Monde terminée, vous la testerez en créant un programme de test qui créé un objet Monde, charge le fichier "ville.dat", et affiche pour chacune des villes son nom, son code, ses cooronnées.
Etape 2: Affichage de la carte
Premières expérimentations
Dans un premier temps, vous allez créer une classe TestDessin héritant de pour expérimenter le dessin dans les fenètre en Java.
Jusque là, vous avez appris à ajouter des composants graphiques dans une fenètre. Ici, il faut directement dessiner dedans. Les dessins se font au sein d'une méthode spéciale appelé automatiquement par Java au moment de l'affichage. Vous devez écrire cette méthode ainsi:
public void paint(Graphics g) {
super.paint(g);
...
}
Vous devez remplacer les trois points par vos instructions d'affichage, qui seront des méthodes de l'objet graphique g. Par exemple, pour dessiner un rectangle de 10 sur 10 aux coordonnées (100,50), on utilisera la méthode:
g.fillRect(100,50,10,10)
Vous devez également ajouter à votre programme la méthode suivante, pour lui premettre de mettre à jour correctement votre dessin en cas de déplacement ou de redimensionnement de la fenêtre:
public void update(Graphics g) {
super.update(g);
paint(g);
}
Expérimentez différentes méthodes d'affichage (rectangle, ligne...) ainsi que l'affichage de chaines de caractères. Consultez la documentation de la class Graphics pour avoir plus d'informations sur les instructions d'affichage.
La classe Carte
Vous allez écrire une classe Carte héritant de JFrame qui sera chargée de l'affichage de la carte. Comme dans la classe de test précédente, l'affichage se fera au sein de la méthode paint.
Bien sûr, vous allez avoir besoin des données sur les villes pour afficher la carte. Celles-ci vous seront fournies sous forme d'un objet de type Monde qui sera passé au constructeur de Carte et stockés sous forme d'attribut de la classe Carte.
Dans un premier temps, l'affichage de la carte ne consiste qu'en l'affichage de chacune des villes. Un point (ou un rectangle ou un cercle) aux coordonnées de chaque ville, et son nom affiché à coté. Pour rendre la carte plus lisible, vous pouvez utiliser une police de caractère plus réduite, ainsi que des couleurs.
Ecrivez la classe Carte et testez-la. Si votre programme est correct, l'ensemble des villes doit se disposer pour former la silhouette de la France.
Etape n°3: Un premier Atlas
Vous allez maintenant transformer votre carte en une application capable d'indiquer une ville selectionnée par l'utilisateur.
L'application que vous allez créer sera une fenêtre divisée en deux parties. Dans la partie gauche, il y aura la carte, et dans la partie droite, il y aura l'interface utilisateur, comportant un titre, une zone de saisie et un bouton. Quand l'utilisateur rentrera le nom d'une ville et cliquera sur le bouton, alors celle-ci devra s'afficher en rouge.
L'interface graphique
Modifiez la classe Carte pour que celle-ci puisse s'insérer dans votre application. Pour cela, elle ne doit plus hériter de JFrame, mais de JPanel.
Votre carte n'est maintenant plus directement affichable, car ce n'est plus une fenêtre, mais un composant graphique. Vous devez donc supprimer l'instruction show(). Pour spécifier la taille du composant, remplacez setBounds(X,Y) par setPreferredSize(new Dimension(X,Y)). Votre composant graphique Carte est maintenant prêt.
Créez maintenant une classe Atlas héritant de JFrame, qui sera votre application principale. Dans le constructeur de votre application, créez un Container et insérez-y un label pour le titre, une zone de saisie et un bouton. Ce Container sera votre interface. Utilisez le layout suivant pour votre container:
BoxLayout interfaceLayout = new BoxLayout(c,BoxLayout.Y_AXIS)
Pour que la zone de saisie ne soit pas trop grande, vous pouvez lui donner une taille maximum avec la méthode setMaximumSize(Dimension d). Ajoutez dans le Content Pane de votre application la carte et l'interface.
Testez votre application. Vous devez voir apparaitre la carte sur la gauche et l'interface sur la droite.
Un premier traitement
Ecrivez dans la classe Monde une méthode:
Ville getVilleParNom(String nomVille)
qui renvoie la ville dont le nom est passé en paramètre.
Ajoutez dans la classe Carte un attribut villeSelectionnee qui contient le code de la ville selectionnée, et une méthode
setVilleSelectionnee(Ville v)
qui permet de changer cet attribut.
Modifiez la méthode paint de la classe Carte pour que la ville selectionnée s'affiche en couleur.
Enfin, modifiez la classe Atlas pour que lorsque l'utilisateur clique sur le bouton "Rechercher", la ville qu'il a entré dans la zone de saisie s'affiche en couleur. Référez-vous à la correction du TP n°7 si besoin est.
Etape n°4: Les routes
Chargement
Le fichier "route.dat" contient les informations concernant les routes entre les villes. Chaque ligne contient trois nombres. Le premier est le code de la ville de départ, le second le code de la ville d'arrivée et le troisième la distance.
Pour chaque ville, vous allez ajouter les informations concernant ses voisines. Pour cela, vous allez ajouter dans la classe Ville trois attributs:
un attribut int nbVoisines, contenant le nombre de voisines
un tableau Ville [] voisines, contenant les villes voisines. Il n'y a jamais plus de 10 voisines, donc vous pouvez déclarer à l'avance un tableau de cette taille.
un tableau int [] distanceVoisines, contenant les distances correspondantes.
Vous allez également ajouter une méthode
public void ajouterVoisine(Ville v,int distance)
permettant d'ajouter une nouvelle voisine.
Dans la classe Monde, vous allez écrire une méthode
public Ville getVilleParCode(int code)
qui renvoie la ville dont le code est passé en paramètre.
Enfin, vous allez ajouter le chargement des routes à la suite du chargement des villes dans la classe Monde. Attention, pour chaque route entre deux villes X et Y, Y doit être ajouté aux voisines de X, et X aux voisines de Y.
Affichage
Modifiez la méthode paint de la classe Carte pour que les routes soit affichées.
Etape n°5: Les itinéraires
Le principe de l'algorithme
Le calcul du plus cours chemin entre deux villes n'est pas un problème très simple à resoudre. Vous allez ici utiliser un algorithme simplifié, qui ne donne pas toujours le meilleur résultat, mais généralement une bonne approximation.
Pour aller d'une ville A vers une ville B, vous allez adopter la demarche suivante:
On se place en A.
On se deplace vers la ville voisine la plus proche de B.
On recommence l'étape précédente jusqu'à se situer en B.
Cet algorithme fonctionne dans la grande majorité des cas, mais pas toujours, comme vous le verrez par la suite.
Mise en oeuvre
Distances
La première chose à faire est d'écrire une méthode de calcul de distance entre deux villes. Attention! Le fichier "route.dat" vous fournit les longueurs des routes entre villes voisines. Dans l'algorithme précédent, vous avez besoin de connaître la distance réélle entre deux villes quelconques. Vous allez pour cela faire un simple calcul de distance grâce aux coordonnées géométriques des villes.
Ajoutez à la classe Ville une méthode public int distance(Ville v) qui renvoie la distance à la ville passée en paramètre.
Aide: pour calculer la racine carrée d'un entier x, vous devez utiliser la méthode suivante: (int)(Math.sqrt(x))
Itineraire
Vous allez maintenant écrire une classe Itineraire, qui caractérise un itinéraire entre deux villes.
La classe contient un tableau de villes, qui sont les villes présentes sur l'itinéraire, ainsi que le nombre de ville. Le tableau sera remplit pendant le calcul de l'itinéraire.
La classe, en plus des accesseurs getVille et getNbVille, possède une méthode:
public boolean contains(Ville v)
qui renvoie true si v est sur l'itinéraire, et false sinon.
Enfin, et surtout, elle possède un constructeur
public Itineraire(Ville depart,Ville arrivee)
qui construit l'itinéraire entre les villes depart et arrivee grâce à l'algorithme décrit précédemment.
Affichage
De même que pour villeSelectionnee, vous allez ajouter un attribut itineraireSelectionne et une méthode
public void setItineraireSelectionne(Itineraire i)
à votre classe Carte.
Vous allez modifier la méthode paint de manière à ce que les villes et les routes sur l'itinéraire apparaissent en couleur.
Enfin, vous allez ajouter à votre atlas deux champ de saisie, l'un pour le départ, l'autre pour l'arrivée, et un bouton pour le calcul de l'itinéraire .
Ecrivez une classe Itinéraire qui décrit un itinéraire entre deux villes, sous forme d'une succession de villes.
Le constructeur Itinéraire
Ajoutez un attribut itineraireSelectionne dans la classe Carte et modifiez la méthode paint de manière à ce que l'itinéraire selectionné s'affiche en rouge.
Rectification
Testez votre programme, par exemple de Bordeaux à Lille. Tout doit fonctionner correctement. Testez-le ensuite du Havre à Caen. Que se passe-t-il? Pourquoi? Comment rectifier cela?
Mon probleme se situe au niveau de l'étape 5 c a d à partir de l itineraire. Je n 'arrivepas à creer la classe Itineraire ni meme la methode pour la construction du plus court chemin.
Actuellement sur mon code, j aiprobleme d'affichage aussi. Quand je selectionne une ville sur le JCombobox, un messaged'erreur s'affiche. J aimerai que quand je selectionne ne ville, celle ci s'affiche en rougeet les autres non.Je poste mon code
//la classe FileTableau
import java.io.*;
import java.util.ArrayList;
import java.util.List;
class FileTableau
{
private int size;
private String lines[];
public FileTableau(String s)
{
try
{
FileInputStream fileinputstream = new FileInputStream(s);
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(fileinputstream));
ArrayList arraylist = new ArrayList();
String s1;
while((s1 = bufferedreader.readLine()) != null)
{
arraylist.add(s1);
}
size = arraylist.size();
lines = (String[])arraylist.toArray(new String[0]);
bufferedreader.close();
}
catch(Exception exception)
{
System.out.println("Erreur de lecture du fichier");
System.exit(0);
}
}
public String getLine(int i)
{
return lines[i];
}
public int getSize()
{
return size;
}
}
//la classe Ville
public class Ville{
private String nom;
private int code,longitude,latitude,nbVilles;
private Ville [] villes;
private int [] distances;
public Ville(String nom, int code, int longitude, int latitude){
this.nom=nom;
this.code=code;
this.longitude=longitude;
this.latitude=latitude;
this.nbVilles = 0;
this.villes = new Ville[10];
this.distances = new int[10];
}
public void addRoute(int distance, Ville ville) {
villes[nbVilles] = ville;
distances[nbVilles] = distance;
nbVilles++;
}
public String toString() {
return "(Ville: " + nom + ",code: " + code + ",longitude: "+longitude+",latitude: "+latitude+")" ;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public int getLongitude() {
return longitude;
}
public void setLongitude(int longitude) {
this.longitude = longitude;
}
public int getLatitude() {
return latitude;
}
public void setLatitude(int latitude) {
this.latitude = latitude;
}
}
// La classe TouteslesVilles
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
final int nb=ft.getSize();
System.out.println("nombre de ville dans le fichier ville.txt: "+nb);
Ville 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 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))
ville=new Ville(tville[i].getNom(),tville[i].getCode(),tville[i].getLongitude(),tville[i].getLatitude());
else
i++;
}
return ville;
}
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;
}
}
// la classe route
public class Route {
private int cd,ca,d;
public Route(int coded, int codea, int dist)
{
this.cd = coded;
this.ca = codea;
this.d = dist;
}
public int getCoded(){
return cd;
}
public int getCodea(){
return ca;
}
public int getDist(){
return d;
}
public void setCoded(int CodeD){
this.cd = CodeD;
}
public void setCodea(int CodeA){
this.ca = CodeA;
}
public void setDist(int Dist){
this.d = Dist;
}
}
// laclasse carte
import javax.swing.*;
import java.awt.*;
class Carte extends JPanel{
/**
*
*/
private static final long serialVersionUID = -4216707929142555363L;
public Carte(ToutesLesVilles maroc){
setSize(1000,1000);
t=maroc.charger("C:/Documents and Settings/Administrateur/Bureau/tout/carte/Ville.txt");
}
public void paint(Graphics g)
{
super.paint(g);
Font f = new Font("time new roman", 2,11);
g.setFont(f);
if(villeSelectionnee!=null)
{
for(int i=0; i < t.length; i++)
{
if(t[i].getNom().equals(villeSelectionnee.getNom()))
{
g.setColor(Color.red);
g.drawString(t[i].getNom(), t[i].getLongitude()-25, t[i].getLatitude()-2);
g.fillRect(t[i].getLongitude(), t[i].getLatitude(), 2, 2);
}
else
{
g.setColor(Color.black);
g.drawString(t[i].getNom(), t[i].getLongitude()-25, t[i].getLatitude()-2);
g.fillRect(t[i].getLongitude(), t[i].getLatitude(), 2, 2);
}
}
}
else
{
for(int i=0; i < t.length; i++)
{
g.setColor(Color.black);
g.drawString(t[i].getNom(), t[i].getLongitude()-25, t[i].getLatitude()-2);
g.fillRect(t[i].getLongitude(), t[i].getLatitude(), 2, 2);
}
}
}
public void update (Graphics g){
super.update(g);
paint(g);
}
public Ville getVilleselectionnee(){
return villeSelectionnee;
}
public void setVilleSelectionnee(Ville villeSelectionnee){
this.villeSelectionnee = villeSelectionnee;
}
private Ville t[];
private Ville villeSelectionnee;
}
// la classe Mafenetre qui extends de JFrame
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);
//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);
ToutesLesVilles maroc=new ToutesLesVilles();
t=maroc.charger("C:/Documents and Settings/Administrateur/Bureau/tout/carte/Ville.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);
//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.setBackground(Color.red);
pcentre.updateUI();
}
catch(Exception e1){
System.out.println("Erreur");
}
}}
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());}
}
}
}
// La classe TInterface, la classe appelante
import java.util.*;
import java.awt.*;
import javax.swing.*;
public class TInterface {
public static void main(String[]args)
{
Dimension tailleEcran = Toolkit.getDefaultToolkit().getScreenSize();
int hauteur = (int)tailleEcran.getHeight();
int largeur = (int)tailleEcran.getWidth();
//Initialisation d une nouvelle fenetre
Mafenetre fen = new Mafenetre();
//au centre de l'ecran
fen.setLocation((largeur-fen.getWidth())/2,(hauteur - fen.getHeight())/2);
//on rend notre fentre visible
fen.setVisible(true);
fen.setResizable(false);
}
}
Aidez moi à contruire la classe itineraire et aussi pour le probleme de l'affichage quand je selectionne une ville.
Merci
voici l énnoncé de mon projet:
Projet de Java: Conception d'un atlas routier
Vous allez dans ce projet écrire une application permettant de calculer et de visualiser sur une carte un itinéraire entre deux villes de France, calculer des itinéraire optimum en temps ou en consommation d'essence, etc...
Les fichiers nécéssaire à ce projet sont les suivants: FileTableau.class, ville.txt, route.txt
Etape 1: Chargement des données
Les données nécéssaires à votre application sont stockées dans des fichiers. Dans un premier temps, nous allons nous intérésser au fichier "ville.dat", qui contient les informations concernant les villes elle-mêmes. Le fichier contient une ligne pour chaque ville enregistrée.
Chaque ligne est construite ainsi: il y a quatre champs, le premier est le nom de la ville, le second son code, le troisième et le quatrième ses coordonnées. Les coordonnées sont fournies en km, et se situent donc entre 0 et 1000. Les champs sont séparés par des ";". Voici un extrait de ce fichier:
Lille;7;617;50
Nice;50;958;797
...
Vous pouvez éditer directement ce fichier dans DrJava ou WordPad pour voir son contenu.
Pour modéliser l'ensemble de nos villes, vous allez écrire deux classes:
La classe Ville, qui contient les données relatives à une ville (nom, code, coordonnées)
La classe Monde, qui contient l'ensemble de toutes les villes. La classe Monde doit posséder un tableau de villes et une méthode:
public void charger(String fichier)
dont le rôle est de remplir le tableau avec les données contenues dans le fichier passé en paramètre (qui sera "ville.dat" dans notre cas).
Pour écrire la méthode "charger", vous avez besoin des outils suivants:
La classe TextFile, qui vous permet de charger un fichier dans un tableau de Strings. Le fichier se charge en créant un objet TextFile ainsi:
TextFile tf = new TextFile("ville.dat");
tf contient alors l'ensemble des lignes du fichier "ville.dat". Cet ensemble peut être interrogé par deux méthodes de la classe TextFile: void getSize() qui renvoie le nombre de ligne, et String getLine(int i) qui renvoie la String correspondant à la ième ligne (à partir de 0).
La classe StringTokenizer, qui va vous permettre d'extraire chacun des champs de la ligne. Vous consulterez la documentation en ligne de Java pour apprendre à vous en servir.
La fonction Integer.parseInt(String s) qui vous permettra de convertir les Strings obtenues en entiers, si besoin est.
Une fois la classe Monde terminée, vous la testerez en créant un programme de test qui créé un objet Monde, charge le fichier "ville.dat", et affiche pour chacune des villes son nom, son code, ses cooronnées.
Etape 2: Affichage de la carte
Premières expérimentations
Dans un premier temps, vous allez créer une classe TestDessin héritant de pour expérimenter le dessin dans les fenètre en Java.
Jusque là, vous avez appris à ajouter des composants graphiques dans une fenètre. Ici, il faut directement dessiner dedans. Les dessins se font au sein d'une méthode spéciale appelé automatiquement par Java au moment de l'affichage. Vous devez écrire cette méthode ainsi:
public void paint(Graphics g) {
super.paint(g);
...
}
Vous devez remplacer les trois points par vos instructions d'affichage, qui seront des méthodes de l'objet graphique g. Par exemple, pour dessiner un rectangle de 10 sur 10 aux coordonnées (100,50), on utilisera la méthode:
g.fillRect(100,50,10,10)
Vous devez également ajouter à votre programme la méthode suivante, pour lui premettre de mettre à jour correctement votre dessin en cas de déplacement ou de redimensionnement de la fenêtre:
public void update(Graphics g) {
super.update(g);
paint(g);
}
Expérimentez différentes méthodes d'affichage (rectangle, ligne...) ainsi que l'affichage de chaines de caractères. Consultez la documentation de la class Graphics pour avoir plus d'informations sur les instructions d'affichage.
La classe Carte
Vous allez écrire une classe Carte héritant de JFrame qui sera chargée de l'affichage de la carte. Comme dans la classe de test précédente, l'affichage se fera au sein de la méthode paint.
Bien sûr, vous allez avoir besoin des données sur les villes pour afficher la carte. Celles-ci vous seront fournies sous forme d'un objet de type Monde qui sera passé au constructeur de Carte et stockés sous forme d'attribut de la classe Carte.
Dans un premier temps, l'affichage de la carte ne consiste qu'en l'affichage de chacune des villes. Un point (ou un rectangle ou un cercle) aux coordonnées de chaque ville, et son nom affiché à coté. Pour rendre la carte plus lisible, vous pouvez utiliser une police de caractère plus réduite, ainsi que des couleurs.
Ecrivez la classe Carte et testez-la. Si votre programme est correct, l'ensemble des villes doit se disposer pour former la silhouette de la France.
Etape n°3: Un premier Atlas
Vous allez maintenant transformer votre carte en une application capable d'indiquer une ville selectionnée par l'utilisateur.
L'application que vous allez créer sera une fenêtre divisée en deux parties. Dans la partie gauche, il y aura la carte, et dans la partie droite, il y aura l'interface utilisateur, comportant un titre, une zone de saisie et un bouton. Quand l'utilisateur rentrera le nom d'une ville et cliquera sur le bouton, alors celle-ci devra s'afficher en rouge.
L'interface graphique
Modifiez la classe Carte pour que celle-ci puisse s'insérer dans votre application. Pour cela, elle ne doit plus hériter de JFrame, mais de JPanel.
Votre carte n'est maintenant plus directement affichable, car ce n'est plus une fenêtre, mais un composant graphique. Vous devez donc supprimer l'instruction show(). Pour spécifier la taille du composant, remplacez setBounds(X,Y) par setPreferredSize(new Dimension(X,Y)). Votre composant graphique Carte est maintenant prêt.
Créez maintenant une classe Atlas héritant de JFrame, qui sera votre application principale. Dans le constructeur de votre application, créez un Container et insérez-y un label pour le titre, une zone de saisie et un bouton. Ce Container sera votre interface. Utilisez le layout suivant pour votre container:
BoxLayout interfaceLayout = new BoxLayout(c,BoxLayout.Y_AXIS)
Pour que la zone de saisie ne soit pas trop grande, vous pouvez lui donner une taille maximum avec la méthode setMaximumSize(Dimension d). Ajoutez dans le Content Pane de votre application la carte et l'interface.
Testez votre application. Vous devez voir apparaitre la carte sur la gauche et l'interface sur la droite.
Un premier traitement
Ecrivez dans la classe Monde une méthode:
Ville getVilleParNom(String nomVille)
qui renvoie la ville dont le nom est passé en paramètre.
Ajoutez dans la classe Carte un attribut villeSelectionnee qui contient le code de la ville selectionnée, et une méthode
setVilleSelectionnee(Ville v)
qui permet de changer cet attribut.
Modifiez la méthode paint de la classe Carte pour que la ville selectionnée s'affiche en couleur.
Enfin, modifiez la classe Atlas pour que lorsque l'utilisateur clique sur le bouton "Rechercher", la ville qu'il a entré dans la zone de saisie s'affiche en couleur. Référez-vous à la correction du TP n°7 si besoin est.
Etape n°4: Les routes
Chargement
Le fichier "route.dat" contient les informations concernant les routes entre les villes. Chaque ligne contient trois nombres. Le premier est le code de la ville de départ, le second le code de la ville d'arrivée et le troisième la distance.
Pour chaque ville, vous allez ajouter les informations concernant ses voisines. Pour cela, vous allez ajouter dans la classe Ville trois attributs:
un attribut int nbVoisines, contenant le nombre de voisines
un tableau Ville [] voisines, contenant les villes voisines. Il n'y a jamais plus de 10 voisines, donc vous pouvez déclarer à l'avance un tableau de cette taille.
un tableau int [] distanceVoisines, contenant les distances correspondantes.
Vous allez également ajouter une méthode
public void ajouterVoisine(Ville v,int distance)
permettant d'ajouter une nouvelle voisine.
Dans la classe Monde, vous allez écrire une méthode
public Ville getVilleParCode(int code)
qui renvoie la ville dont le code est passé en paramètre.
Enfin, vous allez ajouter le chargement des routes à la suite du chargement des villes dans la classe Monde. Attention, pour chaque route entre deux villes X et Y, Y doit être ajouté aux voisines de X, et X aux voisines de Y.
Affichage
Modifiez la méthode paint de la classe Carte pour que les routes soit affichées.
Etape n°5: Les itinéraires
Le principe de l'algorithme
Le calcul du plus cours chemin entre deux villes n'est pas un problème très simple à resoudre. Vous allez ici utiliser un algorithme simplifié, qui ne donne pas toujours le meilleur résultat, mais généralement une bonne approximation.
Pour aller d'une ville A vers une ville B, vous allez adopter la demarche suivante:
On se place en A.
On se deplace vers la ville voisine la plus proche de B.
On recommence l'étape précédente jusqu'à se situer en B.
Cet algorithme fonctionne dans la grande majorité des cas, mais pas toujours, comme vous le verrez par la suite.
Mise en oeuvre
Distances
La première chose à faire est d'écrire une méthode de calcul de distance entre deux villes. Attention! Le fichier "route.dat" vous fournit les longueurs des routes entre villes voisines. Dans l'algorithme précédent, vous avez besoin de connaître la distance réélle entre deux villes quelconques. Vous allez pour cela faire un simple calcul de distance grâce aux coordonnées géométriques des villes.
Ajoutez à la classe Ville une méthode public int distance(Ville v) qui renvoie la distance à la ville passée en paramètre.
Aide: pour calculer la racine carrée d'un entier x, vous devez utiliser la méthode suivante: (int)(Math.sqrt(x))
Itineraire
Vous allez maintenant écrire une classe Itineraire, qui caractérise un itinéraire entre deux villes.
La classe contient un tableau de villes, qui sont les villes présentes sur l'itinéraire, ainsi que le nombre de ville. Le tableau sera remplit pendant le calcul de l'itinéraire.
La classe, en plus des accesseurs getVille et getNbVille, possède une méthode:
public boolean contains(Ville v)
qui renvoie true si v est sur l'itinéraire, et false sinon.
Enfin, et surtout, elle possède un constructeur
public Itineraire(Ville depart,Ville arrivee)
qui construit l'itinéraire entre les villes depart et arrivee grâce à l'algorithme décrit précédemment.
Affichage
De même que pour villeSelectionnee, vous allez ajouter un attribut itineraireSelectionne et une méthode
public void setItineraireSelectionne(Itineraire i)
à votre classe Carte.
Vous allez modifier la méthode paint de manière à ce que les villes et les routes sur l'itinéraire apparaissent en couleur.
Enfin, vous allez ajouter à votre atlas deux champ de saisie, l'un pour le départ, l'autre pour l'arrivée, et un bouton pour le calcul de l'itinéraire .
Ecrivez une classe Itinéraire qui décrit un itinéraire entre deux villes, sous forme d'une succession de villes.
Le constructeur Itinéraire
Ajoutez un attribut itineraireSelectionne dans la classe Carte et modifiez la méthode paint de manière à ce que l'itinéraire selectionné s'affiche en rouge.
Rectification
Testez votre programme, par exemple de Bordeaux à Lille. Tout doit fonctionner correctement. Testez-le ensuite du Havre à Caen. Que se passe-t-il? Pourquoi? Comment rectifier cela?
Mon probleme se situe au niveau de l'étape 5 c a d à partir de l itineraire. Je n 'arrivepas à creer la classe Itineraire ni meme la methode pour la construction du plus court chemin.
Actuellement sur mon code, j aiprobleme d'affichage aussi. Quand je selectionne une ville sur le JCombobox, un messaged'erreur s'affiche. J aimerai que quand je selectionne ne ville, celle ci s'affiche en rougeet les autres non.Je poste mon code
//la classe FileTableau
//la classe Ville
// La classe TouteslesVilles
// la classe route
// laclasse carte
// la classe Mafenetre qui extends de JFrame
// La classe TInterface, la classe appelante
Aidez moi à contruire la classe itineraire et aussi pour le probleme de l'affichage quand je selectionne une ville.
Merci