Liste Chainée en java | Gérer le resize [Resolu] - Java - Programmation
Marsh Posté le 13-11-2002 à 14:15:18
Si les listes chaînée existent en Java, ça veut pas dire grand chose.
Oui, on peut en programmer (encore heureux)
et un liste doublement chainée est incluse dans les JDK pas trop vieux (LinkedList)
Gérer le resize d'une fenêtre... c censé être généré tout seul grâce aux layout, non ?
Marsh Posté le 13-11-2002 à 14:27:30
et puis bon à moins d'avoir un besoin très particulier, un bon ArrayList répond à 95% des besoins !
Marsh Posté le 13-11-2002 à 14:40:00
Logiquement, pour les tri et l'insertion d'éléments à divers endroits de la liste, un LinkedList doit être + performante. non ?
Marsh Posté le 13-11-2002 à 15:52:46
bien sur, bien sur ... mais c'est un besoin assez rare ...
et puis dans ce cas, il y a le TreeSet qui est plus performant.
Marsh Posté le 13-11-2002 à 15:56:55
Marsh Posté le 13-11-2002 à 20:53:12
Alors en fait, je cherche un évenement qui me dise quand l'utilisateur redimensionne la fenetre.
(pour apres redessiner tout ce qui a été dessiné par l'utilisateur, les figures etant mémorisées grace aux listes chainées)
Marsh Posté le 13-11-2002 à 21:10:42
petit coup de javadoc ...
Marsh Posté le 13-11-2002 à 22:48:10
bah ça sert quand même assez régulièrement les listes chaînées! Dès que t'as un truc à longueur non défini que tu veux rendre dynamique et optimisé les listes chaînées c du bonheur!
Marsh Posté le 13-11-2002 à 23:32:19
g un pb avec le resize!!!
voici le code
public class gestion_resize extends ComponentAdapter
{
public void componentHidden(ComponentEvent e) {}
public void componentMoved(ComponentEvent e) {}
public void componentResized(ComponentEvent e)
{
R1=new Repere(-10,10,-5,5,P_Centre);
}
public void componentShown(ComponentEvent e) {}
}
la ligne qui va bien :
P_Centre.addComponentListener(new gestion_resize());
donc quand l'utilisateur redimensionne la fenetre, je demande au programme de retracer un repere graphique selon les dimensions de la fenetre (tout ca a l'interieur de repere)
et ca marche...
... pendant quelques secondes!
je vois le repere s'afficher et apres tout s'efface, on dirait que la machine efface le panel apres l'evenement!
Que faire?
Marsh Posté le 13-11-2002 à 23:33:37
edit : je réponds à Ant-103
en C oui !
plus sérieusement, ca dépend complétement de l'utilisation que tu en fait. Si tu veux accéder à n'importe quel élément rapidement, c'est certainement pas la meilleur structure.
Une ArrayList répond très bien au besoin que tu as exprimé
Marsh Posté le 13-11-2002 à 23:42:18
thunderbird54 a écrit a écrit : ok je v voir ca et pour mon pb sur le resize? |
je sais pas ... je maîtrise pas bien les inetraces graphiques en Java, j'ai que de très vagues connaissances ...
Marsh Posté le 14-11-2002 à 13:08:52
ok je posterais ca se dans l'aprem ou ce soir!
une petite idée d'ou ca pourrais venir?
Marsh Posté le 14-11-2002 à 13:13:24
Nope. A part que tu fais un clear suite à la réception d'un autre événement, je ne vois pas...
Marsh Posté le 14-11-2002 à 20:59:40
non pas de clear voic le code...
il s'articule autour de 3 classes, la pincipale, le fond (bouton,menu, gestionnaire de clik) et repere (tracage)
classe Fentre :
Code :
|
Classe Fond : (Attention c long)
Code :
|
et pour finir la class Repere :
Code :
|
voila cherchez l'erreur!
Marsh Posté le 15-11-2002 à 13:46:27
Je n'ai pas compilé ton truc, mais de ce que j'en ai compris, quand ton fond est redimensionné, tu lui changes son repère. Le problème, c'est que tu crées un nouvel objet Repere : du coup, le fond est obligé de se rafraichir une 2ème fois, puisque son contenu a changé ! Et comme l'objet Repere, qui est un objet java.awt.Panel, n'implémente pas la méthode paint(), c'est l'implémentation de sa classe mère qui est exécutée.
Bref : tout cela ne serait pas arrivé si ta classe Repère implémentait correctement paint().
ERt, pour conclure, une remarque de base en GUI fenêtré : ne jamais dessiner en dehors du code ou des méthodes réservées au rafraichissement (et qu'est-ce que tu fais, toi, dans ton constructeur de Repère ? Tu dessines un repère ! )
Marsh Posté le 15-11-2002 à 19:06:17
ben g po eu de cours j'apprend tout seul
kes ke tu me conseilles de faire? de creer une methode paint() dans ma classe repere? bizarre
avec le supercomponent et tout?
Marsh Posté le 15-11-2002 à 22:17:55
pourrais tu me montrer par un exemple ce que tu me dit a propose de la methode paint() ?
Je ne saisis pas tout a fait comment je dois faire.
Merci
Marsh Posté le 18-11-2002 à 10:39:47
Désolé, mais le week-end, je ne suis plus sur le forum...
Je te propose de réécrire ton constructeur et (d'écrire) ta méthode paint() comme suit :
Code :
|
Et si tu apprends tout seul, je te conseille vivement de lire et de suivre les recommendations de Sun en ce qui concerne la présentation du code. Cela améliore grandement la lisibilité du code (bien qu'il y ait nettement pire que ton code... ).
Je vais tâcher de te retrouver ça...
Marsh Posté le 18-11-2002 à 16:37:53
J'ai (enfin ! ) retrouvé le lien : http://java.sun.com/docs/codeconv/
A lire absolument.
Marsh Posté le 19-11-2002 à 10:23:35
j'ai regardé le code que tu as reecrit et une question me vient a l'esprit :
Quand est ce que se deroule l'appel a paint?
chez moi il n'est pas réalisé.
Et pour t remarque, tu as tout a fait raison, je n'ai pas besoin de dim ailleurs que dans paint.
Pour les valeurs absolues aussi!
Marsh Posté le 19-11-2002 à 10:43:47
Normalement, c'est le framework AWT qui gère l'appel à paint() (aidé par l'OS sous-jacent, il faut bien le reconnaître).
Plus précisément, un composant est rafraichi lorsque son conteneur (ex : un Panel) le lui demande. Souvent, c'est parce que lui-même a reçu un ordre de se rafraichir lui-même.
Cependant, tu peux forcer le rafraichissement de tout composant graphique (donc en particulier d'un conteneur) en appelant repaint() sur cet objet.
Marsh Posté le 19-11-2002 à 17:46:00
je dois faire un Pan.repaint() dans le constructeur de repere c ca?
c'est de ce j'ai fait, mais ca ne marche pas! (surement lié a une erreur ou un oubli de ma part mais je ne vois pas ou!)
je reposte le nouveau code de repere qui s'appelle maintenant repere2 lol.
je n'ai pas encore lu les conventions, je m'en excuse.
Code :
|
Marsh Posté le 19-11-2002 à 19:32:16
thunderbird54 a écrit a écrit : je dois faire un Pan.repaint() dans le constructeur de repere c ca? c'est de ce j'ai fait, mais ca ne marche pas! (surement lié a une erreur ou un oubli de ma part mais je ne vois pas ou!) je reposte le nouveau code de repere qui s'appelle maintenant repere2 lol. |
Essaie d'appeler Pan.invalidate() à la place de Pan.repaint(), pour voir...
Si ça ne marche pas, il va falloir que j'essaie de déboguer ton code chez moi.
Citation : |
Ne t'inquiète pas : "Rome ne s'est pas construite en un jour"
Marsh Posté le 19-11-2002 à 20:41:44
pan.invalidate() c pareil!
en fait, le programme ne rentre jamais dans paint c pour ca!
g fé un test avec un System.out.println("Paint" ); et jamais je ne vois paint qui s'affiche dans la fenetre dos!
voila sinon je ne c pas pkoi il ne rentre po dedans!
Marsh Posté le 20-11-2002 à 23:50:04
bon g trouvé d'ou vient le probleme, mais ce n'est pas pour ca que je l'ai résolu lol!
donc mon programme est articulé autour de 3 classes:
-Fenetre
-Fond
-Repere2
Dans fond, on definit un borderlayout et on crée l'interface (menu,bouton,parametres des axes) c'est aussi la que l'on definit le JPannel P_Centre.
Lorsque je fais appel à mon constructeur repere, je lui passe en paramètre ce panneau centre! Le panneau ainsi créée dans Repere2 prend donc l'adresse de panneau centre et lorsque l'on fait un resize, ce n'est pas la methode paint de Repere2 qui est appelée mais celle de Fond!
voila je ne c pas si g été tres clair
Marsh Posté le 26-11-2002 à 09:27:20
Je ne comprends pas bien la hiérarchie de tes composants: le contenu de Fenetre est Fond, mais où est Repere2? Dans une autre fenêtre?
Marsh Posté le 26-11-2002 à 13:24:57
alors en fait repere2 est chargée de redessiner le panneau centre de ma fentre
Marsh Posté le 13-11-2002 à 13:39:04
voila j'ai 2 questions :
est ce que les listes chainées existe en java?
Si oui comment les utiliser.
Comment gerer le resize d'une fenetre graphique?
Merci
Message édité par thunderbird54 le 26-11-2002 à 20:39:48