java-sql-interface swing - Java - Programmation
Marsh Posté le 16-01-2005 à 19:39:49
si tu touches à JTable, je te tue, mais je te fais crever en 3 jours.
Tu as un problème de TableModel, je sais pas lequel.
Va te renseigner sur MVC (Model View Controller), pour comprendre les bases.
Marsh Posté le 16-01-2005 à 20:32:57
nraynaud a écrit : si tu touches à JTable, je te tue, mais je te fais crever en 3 jours. |
ca va pas nan ?? faut arrêter les délires là, hein !!
Marsh Posté le 16-01-2005 à 20:39:23
la police de la convivialité à laissé son humour au vestiaire ?
largue ta copine et ton poste de modo si c'est pour devenir comme ça. Pis mets-toi au java par la même occasion.
Marsh Posté le 16-01-2005 à 20:54:06
c'est tellement naze que je sais pas quoi te répondre ...
Marsh Posté le 16-01-2005 à 21:16:06
ma soluce (ca vaut ce que ca vaut)
Code :
|
tu appelle un setData() avec un nouveau tableau de tableau d'objet (dans mon exemple g foutu une arraylist d'arraylist, mais tu converti au besoin)
tt la farce est faite dans setData, et le fait que tt les méthodes du modèle récupèrent ce qui se passe dans data
Marsh Posté le 16-01-2005 à 21:21:27
Jubi > y'a pas un DefaultTableModel que tu peux hériter pour faire moins de code ? il fait pas ce qu'il veut ? (réelle question, j'ai la flemme d'aller dans la javadoc)
Marsh Posté le 16-01-2005 à 21:26:19
-->réelle réponse : j'en ai pas la moindre idée...c issue d'un projet codé à la va comme je te pousse...
Y'a un http://java.sun.com/j2se/1.4.2/doc [...] Model.html
et un
http://java.sun.com/j2se/1.4.2/doc [...] Model.html
dont g pas forcément regardé les différences...(le code en dessous avec les commentaires javadoc, c un copier//coller rapide des sources du Default je crois)
==>le truc c de fire un fireTableDataChanged(); qui lui force le refresh (y faut peut etre un pack() après dans la GUI, mais c pas forcé il me semble)
Marsh Posté le 16-01-2005 à 21:30:06
non, le pack() c'est interdit !
oué, j'aime bien avoir les fireBidule et les addMchinListeners tout faits, je me dis qu'il font ça mieux que moi, et qu'il peuvent changer d'avis dans le futur (le stockage des listeners est un point critique dans les performances).
Marsh Posté le 16-01-2005 à 21:33:53
-->si pack() est interdit tu fais un refresh comment ? en plus pack ca force les composant à se redessiner avec la taille qu'ils doivent avoir...
--> faudrait voir, mon exemple marche peut etre si on sous classe le defaultTableModel et qu'on surcharge tt les op de bases sur le model... surtout le getValueAt
Marsh Posté le 16-01-2005 à 21:39:35
TU ne fais pas de refresh.
le TableModel prévient le JTable que ses données ont été modifiées, c'est au JTable d'en tirer les conséquences et d'entreprendre les actions appropriées. Et là ça peut être un bordel complet parce qu'il peut décider de ne redessiner que quelques cellules, de refaire du calcul de layout, etc.
C'est du MVC de base.
Marsh Posté le 16-01-2005 à 21:43:01
oui mais si le tableau change de dimension suite à ce refresh...ben ta fenetre de base est plus assez grande pour l'afficher correct ??
comment tu fais que ton tableau notifie son container que son viewport a changé ? y'a moyen qu'un composant puisse prévenir son conteneur / le gestionnaire de layout de se containeur de redessiner le bouzin ?
Marsh Posté le 16-01-2005 à 21:59:49
Jubijub a écrit : oui mais si le tableau change de dimension suite à ce refresh...ben ta fenetre de base est plus assez grande pour l'afficher correct ?? |
Il prévient le layoutManager que ses preferedSize ont changé. Le layoutManager se démerde avec son problème.
Par contre, je te rappelle qu'en général les JTable sont dans des JScrollPane (et sinon on voit pas les titres des colones) et donc ça peut dégueuler sans pb.
les pack() c'est sur les JFrame, et ça sert à changer la taille extérieure de la fenêtre. Si le fait d'ajouter une ligne dans un tableau me modifie le placement et la taille de mes fenetres sur mon bureau, ils ont pas fini de m'entendre gueuler comme un putoi.
Marsh Posté le 17-01-2005 à 11:32:33
je dois avouer que dans mon projet g du coder mes tailles de fenetre en dur...parce que sinon la première fois le pack() faisait une fenetre trop petite pour afficher le tableau...et g jamais trouvé pkoi...du coup je forcais une taille en dur, et je rappellais pack, qui bizarrement à la seconde fournée fonctionnait proprement..c moche mais bon
Marsh Posté le 18-01-2005 à 18:31:42
Aïe, ok, ça se complique pas mal. Je croyais que je pouvais coder des trucs simple sans passer par les models. Bon, va falloir que je m'y mette alors.
En tt cas, merci pour toutes ces réponses!
Marsh Posté le 18-01-2005 à 18:42:54
heu, c'est justement plus simple de n'utiliser que des modèles (mais effectivement, pour une raison que j'ignore ça parraît plus compliqué aux débutants)
Marsh Posté le 18-01-2005 à 18:49:27
Sinon, une petite question subsidiaire. Vous en pensez quoi, j'ai mis cette JInternalFrame (qui contient donc l'affichage du tableau d'objet) dans une classe à part de la JFrame principale. Cette classe est appelée lors de l'initialisation de l'interface. Je la laisse à part pour que ce soit plus lisible, ou je mets toutes les interface dans la meme classe, pour eviter des pbs?
Marsh Posté le 19-01-2005 à 08:55:57
crozet a écrit : ou je mets toutes les interface dans la meme classe, pour eviter des pbs? |
java c'est pas vb (quoi que meme dans vb t'as un fichier par form)
Marsh Posté le 19-01-2005 à 08:57:37
nraynaud a écrit : heu, c'est justement plus simple de n'utiliser que des modèles (mais effectivement, pour une raison que j'ignore ça parraît plus compliqué aux débutants) |
je suis pas d'accord, non
c'est plus complique ET ca implique de pisser bcp plus de lignes de code
Marsh Posté le 19-01-2005 à 09:16:55
nraynaud a écrit : beemer > tu prends quoi comme dope ? |
ca c'est une reponse inteligente
regarde un peu la soluce de Jubijub, ca te semble pas abuse pour rafraichir un tableau? pour quoi pas faire un LabelModel ou TextModel avec 2-3 listeners pour changer le text d'un label ou d'une zone de saisie
PS: d'ailleurs parlant de MVC, JTable met a dispo un constructeur (data[][], column[]) mais pas de setData : ca te semble coherent?
Marsh Posté le 19-01-2005 à 11:35:24
ReplyMarsh Posté le 19-01-2005 à 11:46:42
Code :
|
Marsh Posté le 19-01-2005 à 11:52:57
nraynaud a écrit :
|
c'est toujours ca de lignes en plus pour un gars qui veut seulement faire un setData(newdata) sur un tableau qui a toutes les props par defaut...chose qui marche d'ailleurs tres bien la 1ere fois avec le constructeur de data et columnNames
si tu veux faire un truc plus chiade je suis d'accord a user et abuser de models et de renderers mais pour un truc simple c'est casse couilles
a la limite je dirais rien s'il y avait pas de constructeur Jtable a partir de donnees, mais uniquement des models
Marsh Posté le 19-01-2005 à 13:49:13
si tu lisais proprement la doc, tu saurais que setData c une méthode de mon cru, qui n'existe pas dans le default ni dans l'abstract model...
avec ta méthode, il te faut recréer un modèle à chaque fois, puis le réaffecter...moi je récupère mon modèle, et je le MAJ
Je précise aussi que derrière j'avais une base de données Objet, et que j'appellais des rafraichissements fréquement...et je pense que c bcp plus optimisé d'utiliser les méchanismes de refresh du model, qui ne repeint donc que ce qui a réellement changé dans le tableau, plutot que l'overhead de changer de modèle, ce qui implique refaire les modèles de colonnes et de cellule, alors qu'ils ne changent pas...
donc ta méthode est sale, et comme l'a montré nraynaud, mon code est long parce que g copié coller des bouts de modèles...mais en extendant proprement abstractModel, ca prend 20 lignes...
du coup c pas trop lourd, et c terriblement plus propre, et plus extensible (amuse toi plus en détail avec des tableaux, et tu verras qu'en fait il te faut 3 modèles persos si tu veux faire des trucs hors des sentiers)
Marsh Posté le 19-01-2005 à 14:19:28
c'est vrai aussi que plutot que d'avoir un constructor de JTable avec un Object[][], ca aurait été tout aussi simple qu'il fournisse plutot un ArrayTableModel ...
Marsh Posté le 19-01-2005 à 18:58:18
oui c clair...c un peu archaique le Object[][]...
ca aurait aussi été intellignet de permettre de changer les données du modèle facilement...mon setData() quoi...
Marsh Posté le 19-01-2005 à 19:09:19
d'un autre coté, dans un vrai cas de figure et pas un test d'étudiant, tu vas rarement avoir un Object[][] pour representer ton domain model... me semble que t'auras une Collection<Bidule> ou une Bidule[] quoi...
Marsh Posté le 19-01-2005 à 19:23:47
dans ce cas, autant ne pas mettre le constructeur avec le Object[][]
Marsh Posté le 19-01-2005 à 19:37:58
ce serait mieux avec ArrayList ou Vector...ou meme avec une collection...
mais bcp de composant swing ont un constructeur où on peut passer le contenu du modèle avec
Marsh Posté le 19-01-2005 à 19:54:27
benou a écrit : dans ce cas, autant ne pas mettre le constructeur avec le Object[][] |
bah ça permet de prototyper/tutorer vite fait
Marsh Posté le 19-01-2005 à 21:14:10
ca existe aussi avec Vector ...
m'enfin bref, ceux qui ont compris, ont deja compris
the real -- : ca cert a quoi de prototyper quoi que ce soit si tu peux pas l'utiliser apres?!
jubijub : bcp (la plupart meme) de compos swing permettent aussi de changer les donnes du modele via le viewer
Marsh Posté le 16-01-2005 à 18:02:10
Salut à tous. Je suis en train de développer un programme en java qui utilise entre autres une liaion JDBC avec ma BDD mysql,swing et java.io.
Description programme:
Je récupère des données sous format NMEA d'un GPS, effectue un hashage ($GPLL) dessus pour en ressortir la position actuelle et les enregistre les valeurs dans la BDD.
En même temps, je rentre les valeurs de mon apareil de mesures dans un BDD. J'effectue ensuite une fusion des tables via la clé date dans une table fusion.
Ensuite, je convertis la table fusion en Object[][].
Lors de la création de l'interface swing, qd l'affichage de fusion est demandé, je cree une Jtable avec ce Object[], qui est ensuite mis dans un JScrollPane.
Problème:
L'affichage marche très bien, mais quand les valeurs de la table fusion de la BDD change, je dois redemander le reaffichage de la JTable. ET ca ne marche pas. J'ai bien essayé le repaint, mais kedalle.
Mes Questions:
Est-ce que je dois utiliser un PaintManager, ou il y a une petite commande de merde que j'ai pas trouvé?
Est-ce que je me goure complétement dans la manière de faire et dans ce cas là, est-ce que vous avez des ex d'interface java simple pour BDD, histoire ke je voie commennt ca marche ( et repondez pâs alltheweb, jai esayé, rien de concluant )
Et sinon, est-ce que vous avez trouvé des tutaux private secret qqpart sur swing-PaintManager!
Hesitez pas a balancer n'importe quel remarque classe, ça peut que me faire avancer!