OK oui en effet peut-être pas besoin d'y faire à chaque refresh, c'est toujours ça de gagné mais ca ne change rien
Merci !
OK oui en effet peut-être pas besoin d'y faire à chaque refresh, c'est toujours ça de gagné mais ca ne change rien
Merci !
L'affichage est parfait. Tu as juste le thread main qui est en boucle en while true, donc il bouffe 100% du processeur. Forcément, le thread graphique, il doit se battre pour accéder au processeur, donc il fonctionne comme il peut, et c'est saccadé.
Un petit Thread.sleep(100) dans ta boucle (avec le try catch qui va avec) ça devrait beaucoup aider.
Enfin, tu utilises deux threads : un qui déplace les voitures, et un qui actualises l'affichage. Tu peux en utiliser un seul qui déplace les voitures puis actualise l'affichage (puis dort pendant quelques millisecondes).
OK j'ai touché à 2/3 trucs et ca va un poil mieux.
Je ne peut pas mettre une valeur de sleep() trop élevée car cela influ sur la vitesse de déplacement des véhicules, il me faut au maximum un sleep(30).
J'ai plus le temps de réétudier tout ça car je dois rendre le projet pour lundi mais je m'y pencherai peu-être ultérieurement. C'est juste un peu domage de rendre un truc qui rame un peu .
En tout cas merci à tous pour votre patience.
Sinon juste pour info est-ce possible de transcrire ça en utilisant OpenGL ou autres afin que ça soit vraiment fluide comme les jeux? c'est difficile? il faut des prérequis?
La vitesse d'exécution d'une simulation (modèle) ne doit jamais être influencée par son affichage dans la vue...Envoyé par Yann39
Mais bon, tout refaire pour lundi, ça va être short
Enfin c'est juste le rapport que je dois rendre lundi, je présente mon projet la semaine d'après, mais si le rapport ne correspond pas avec l'appli ca serait dommage.
Sinon, avant que j'y pense, comment je peut faire pour rafraichir mon PanelCommande. En effet lorsque mon PanelRoute s'exécute, je change des valeur de mon PanelCommande (par ex : PanelCommande.jTextField7.setText("salut"); ). Je voudrais par exemple qu'a chaque rafraichissement mon Panel recoive la vitesse courante de la voiture.
J'ai essayer revalidate() mais ca ne fonctionne pas.
Il faut pas que je fasse un thread qui rafraichi mon PanelCommande quand même ?
Tu voulais dire "pendant que j'y pense" ?Envoyé par Yann39
Pour cela, il faut utiliser des listeners:
http://rom.developpez.com/java-listeners
La solution que tu proposes "Il faut pas que je fasse un thread qui rafraichi..." est exactement ce qui est décrit dans "III. Mauvaise approche"
lol OK je te remerci
Je vais étudier ça.
Bon décidément je n'arrive plus rien à faire.
Ca fait plus d'une heure que je suis dessus et je ne voit pas du tout comment fonctionne ces listeners.
Ya pas une autre solution ?
Qu'est-ce qui te pose problème?Envoyé par Yann39
C'est la solution à utiliser ici...Ya pas une autre solution ?
C'est le fonctionnement que je ne comprend pas.
J'ai fait une interface InterfaceCommande comme ceci :
J'implémente cette interface dans ma classe PanelCommandes, où je redéfini les méthode de l'interface :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public interface InterfaceCommande extends EventListener { void NbVoituresChange(double nouveauNbVoitures); void NbDepassementsChange(double nouveauNbDepassements); void VitesseMoyenneChange(double nouvelleVitesseMoyenne); }
Et c'est là que je comprend plus, qu'est-ce que je doit mettre dans PanelRoute pour qu'a chaque rafraichissement la vitesse de la voiture s'affiche dans mon jTextField ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public void NbVoituresChange(double nouveauNbVoitures){ jTextField8.setText(""+nouveauNbVoitures); } public void NbDepassementsChange(double nouveauNbDepassements){ jTextField2.setText(""+nouveauNbDepassements); } public void VitesseMoyenneChange(double nouvelleVitesseMoyenne){ jTextField5.setText(""+nouvelleVitesseMoyenne); }
j'ai essayé comme ceci mais ca ne change rien (ce que j'ai rajouté est en rouge) :
A mon avis j'ai fait n'importe quoi, je n'arrive pas à comprendre les exemples même avec beaucoup de bonne volonté...
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 public class PanelRoute extends javax.swing.JPanel { private final EventListenerList listeners = new EventListenerList(); // boucle d'affichage RenderingThread renderingThread = new RenderingThread(); // buffer mémoire (2eme buffer) Graphics buffer; // image mémoire correspondante au buffer Image image; PanelCommandes panelC = new PanelCommandes(); private TexturePaint texture_herbe, texture_asphalte; public PanelRoute() { initComponents(); setOpaque(true); texture_herbe = CreerTexture("herbe.jpg"); texture_asphalte = CreerTexture("asphalte.jpg"); this.setSize(Main.autoroute.longueur()+60,700); renderingThread.start(); } public InterfaceCommande[] getInterfaceCommande() { return listeners.getListeners(InterfaceCommande.class); } public TexturePaint CreerTexture(String UrlImage) {...} public Graphics2D DessinerTextures(Graphics g) {...} public Graphics2D DessinerRoute(Graphics g) {...} public Graphics2D DessinerPeages(Graphics g) {...} public Graphics2D DessinerVehicules(Graphics g) {...} public void paintComponent(Graphics g) { super.paintComponent(g); if(buffer==null){ image = createImage(Main.autoroute.longueur()+1000,this.getHeight()); buffer = image.getGraphics(); } DessinerTextures(buffer); DessinerRoute(buffer); DessinerVehicules(buffer); for(InterfaceCommande listener : getInterfaceCommande()) listener.NbVoituresChange(4); //Création d'un graphics 2d Graphics2D g2d = (Graphics2D)g; //Enlève l'antialiasing pour les shapes g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); //Enlève l'antialiasing pour le texte g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); /** Demande de rendu rapide */ g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); //On dessine le buffer mémoire dans le buffer d'affichage g2d.drawImage(image,1,1,this); } public void update(Graphics g) { paintComponent(g); } class RenderingThread extends Thread { public void run(){ while(true){ try { repaint(); sleep(20); } catch ( Exception e ) {} } } }
Il te manque les méthodes addXXXListener(...) et removeXXXListener(...) dans ton PanelRoute...
Et sinon, il suffit une fois que tu les auras définies, d'appeler:
À partir du moment où cette instruction aura été exécutée, ton "panel commande" écoutera ton "panel route"... (grâce aux méthodes définies dans l'interface commande)
Code : Sélectionner tout - Visualiser dans une fenêtre à part tonPanelRoute.addInterfaceCommande(tonPanelCommande);
Grâce à ta remarque, j'ai remarqué que je n'avais pas précisé comment ajouter un écouteur à un objet écouté (en l'occurence dans l'exemple, la météo).Envoyé par Yann39
C'est maintenant chose faite, j'ai rajouté 3 lignes à la fin de la section IV-A...
Bon soit je suis mauvais soit je suis pas bon mais ya un problème ...
J'ai rajouter les 2 méthode dans PanelRoute :
Et après je le met ou le
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public void addInterfaceCommande(InterfaceCommande listener) { listeners.add(InterfaceCommande.class, listener); } public void removeInterfaceCommande(InterfaceCommande listener) { listeners.remove(InterfaceCommande.class, listener); }Si je le met dans le PaintComponent ca ne fait rien, c'est pourtant là qu'il faudrais qu'il soit, non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part addInterfaceCommande(new PanelCommandes());
Tu le mets où tu veux, l'important c'est que tu passes en paramètre ton bon PanelCommandes, pas un nouveau avec new PanelCommandes()...Envoyé par Yann39
lol désolé de t'embêter mais je ne voit vraiment pas.
Comment passer mon PanelCommande sans en créer un nouveau.
Je peut faire :
Mais c'est pareil.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 PanelCommandes PanelC = new PanelCommande(); .... addInterfaceCommande(PanelC);
On va y arrivé !
Il faut que ça soit ton panelcommande que tu as ajouté à ton interface graphique...Envoyé par Yann39
Ah excuse (mais tu n'avais pas mis la classe en entier), mais PanelCommandes n'étends pas JPanel?
C'est le nom qui m'a induit en erreur...
Donc si c ça c bon ok...
pfwaa ca marche !
J'ai du faireet ensuite faire "this.jPanel1.add(PanelC);" au lieu de "this.jPanel1.add(new PanelCommandes);" dans ma classe Fenetre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part public static PanelCommandes PanelC = new PanelCommandes();
Comme ça je peut y accéder depuis PanelRoute.
Vraiment merci ®om longue vie à toi.
Je vais pouvoir dormir tranquille.
Par contre là à force de rajouter des trucs c'est devenu vraiment lent, lorsqu'il commence à avoir plus de 3 ou 4 voitures sur la route ca rame vraiment et on ne voit même plus les voitures bouger.
Je vais voir pour changer l'architecture du truc, si vous avez une idée je suis preneur.
Merci !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager