Bonjour,
j'ai dans mon appli, un JTable danns un JScrollPane. Mais mon JSCrollPane ne s'affiche qu'apres avoir cliqué quelque part...
Avez-vous une idée d'ou peut venir le problème ?
Bonjour,
j'ai dans mon appli, un JTable danns un JScrollPane. Mais mon JSCrollPane ne s'affiche qu'apres avoir cliqué quelque part...
Avez-vous une idée d'ou peut venir le problème ?
Salut,
Tu n'ajouterais pas ton JScrollPane dans une fenêtre déjà visible ?
Si c'est le cas il faut le faire dans l'EDT avec SwingUtilities.invokeLater(), et eventuellement rajouter un repaint()...
a++
J'ajoute mon JScrollPane dans un JPanel déja visible oui...
Comment j'utilises ta fonction SwingUtilities.invokeLater() ?
Pourquoi ne pas l'ajouter dès que tu crée ton composant ?Envoyé par wichtounet
Il suffit de lui passer un objet Runnable en paramètre. Le code de la méthode run() sera alors exécuté dans l'EDT dès que possible.Envoyé par wichtounet
Cela permet d'éviter d'avoir des conflits de concurrence :
Dans ton cas il faut rajouter un revalidate()/repaint() afin que le Panel soit bien mis à jours et re-affiché...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SwingUtilities.invokeLater( new Runnable() { public void run() { panel.add(...); panel.revalidate(); panel.repaint(); } });
a++
parce que le contenu du jtable n'est pas encore initialisé quand je crée mon JPanel...Envoyé par adiGuba
Je vais essayer ta technique, et je te redis
C'est pourquoi il faut utiliser un TableModelEnvoyé par wichtounet
a++
Ca voudrait dire que je pourrais initialiser mon tableau au départ en fonction d'un modele et ensuite charger à l'intérieur les données que je veut ?
P.S. Ensuite j'aurais besoin de pouvoir changer les données du tableau par des données plus fraiches... Est ce que je dois bel et bien me tourner vers l'optique d'un tableModel ?
Oui...
Tu travailles sur ton modèle de données, qui renseigne des changements, et ce dernier se mets à jours...
Je te conseille d'étendre AbstractTableModel qui gère les listener et les méthodes fireXXX()...
Je dois avoir un bout de code quelques part si tu veux...
a++
Je prendrais ton bout de code avec plaisir, merci pour ton aide
Salut,
Ca donne quelque chose du style (j'ai supprimé le code spécifique qui ne te servirait pas) :
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 public class MyTableModel extends AbstractTableModel { private static final int FILE_NAME = 0; private static final int DATE = 1; private static final int STATUS = 2; private String[] columnNames = {"Fichier", "Date", "Status"}; private List rows = new ArrayList(); // Méthodes de l'interface TableModel public int getColumnCount() { return this.columnNames.length; } public String getColumnName(int column) { return this.columnNames[column]; } public int getRowCount() { return this.rows.size(); } public Object getValueAt(int row, int column) { // On récupère l'élément de la ligne courante : FileInfo info = (FileInfo) this.rows.get(row); Object value = null; if (info!=null) { // Et on récupère le champs souhaité switch (column) { case FILE_NAME: value = info.getName(); break; case DATE: value = info.getDate(); break; case STATUS: value = info.getStatus(); break; } } return value; } public boolean isCellEditable(int row, int column) { // Aucune cellule éditable return false; } // Méthodes permettant d'ajouter/supprimer des éléments : public void add(FileInfo info) { this.rows.add(info); int index = this.rows.size() - 1; super.fireTableRowsInserted(index, index); } public void remove(int index) { this.rows.remove(index); super.fireTableRowsDeleted(index, index); } public void clear() { this.rows.clear(); super.fireTableDataChanged(); } }
Le fait d'étendre AbstractTableModel t'évite d'avoir à implémenter les methodes add/removeTableModelListener(), mais en plus cette classe fournit un ensemble de méthode fireXXXXX() qui permettent d'envoyer des evenements lorsque tu modifies ton modèle...
Il ne reste plus qu'à modifier quelques méthodes pour le nom des colonnes et les données elles-mêmes.
Dans ce cas j'utilise un liste d'objet perso, et la méthode getValueAt() me permet de renvoyer la bonne valeur pour la colonne. Chaque objet contenant les information d'une ligne de mon tableau.
Tu pourrais également faire avec un tableau imbriqué mais je trouve cela plus complexe à gérer...
Si ton tableau doit être editable, il faut également redéfinir la méthode setValueAt() (qui ne fait rien par défaut).
Ensuite il faut te créer les méthodes pour modifier les données de ton modèle (add(), remove() et clear() dans mon code). Le plus important étant de bien faire appel à la méthode fireXXX() correspondante pour que la JTable (et eventuellement d'autre objet) soit bien avertit des changements...
a++
Merci beaucoup 8)
Je n'aurai pas besoin de tout, car quand je change quelque chose, je change tout le tableau directement.
En plus, la seule chose que je récupere ensuite sur ce tableau est l'index qui est selectionné...
Je vais essayer d'implémenter ce modele ce soir et je te redis
Est ce que quelque chose comme ca pourrait marcher ? :
La fonction setData me servira à changer tout le tableau, car c'est la seule modification que je ferai sur mon JTable.
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 public class MyModel extends AbstractTableModel{ private String[] columnHeader = {/* Je mets pas car ca prend pas mal de lignes ^^ */} private Object[][] rows = null; public Object getValueAt(int arg0, int arg1) { return rows[arg0][arg1]; } public int getColumnCount() { return this.columnHeader.length; } public String getColumnName(int column) { return this.columnHeader[column]; } public int getRowCount() { return this.rows.length; } public boolean isCellEditable(int row, int column) { // Aucune cellule éditable return false; } public void setData(Object[][] newData){ rows = newData; super.fireTableDataChanged(); } }
C'est bon ca marche
Merci beaucoup de m'avoir aidé ainsi
en plus c'est drolement plus propre
et ca facilite nettement ma méthode de rafraichissement...
que d'avantage dans une si petit chose ^^
Par contre il n'affiche plus le header, tu as une idée d'ou ca pourrait venir ?
Depuis que j'ai fait mon modele, le header ne s'affiche plus...
voila le code de mon tableModel :
et je fais tout simplement
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 import javax.swing.table.AbstractTableModel; public class MyModel extends AbstractTableModel{ private static final long serialVersionUID = 8083956857937064934L; private String[] columnHeader = {Constantes.LANGUAGE_PROPERTIES.getProperty("header0"),Constantes.LANGUAGE_PROPERTIES.getProperty("header1"), Constantes.LANGUAGE_PROPERTIES.getProperty("header2"),Constantes.LANGUAGE_PROPERTIES.getProperty("header3")}; private Object[][] rows = new Object[0][0]; public Object getValueAt(int arg0, int arg1) { return rows[arg0][arg1]; } public int getColumnCount() { return this.columnHeader.length; } public String getColumnName(int column) { return this.columnHeader[column]; } public int getRowCount() { return this.rows.length; } public boolean isCellEditable(int row, int column) { // Aucune cellule éditable return false; } //Fonction qui va s'occupper de remettre à jour tout mon tableau et qui va mettre //à jour aussi l'affichage public void setData(Object[][] newData){ rows = newData; super.fireTableDataChanged(); } }
GuiMain.model.setData(Functions.messagesList);
pour mettre les données à l'intérieur... Tout marche, je peut changer les données quand je veut mais le header ne s'affiche pas
Quelqu'un aurait il une idée du pourquoi du comment ?
Ta JTable est bien dans un JScrollPane ?
Le contenu de ton attribut columnHeader est-il correct ?
a++
C'était bien ca , le fichier properties n'était pas encore chargé(Je sais pas pourquoi), mais maintenant ca marche...
merci
Encore une chose, est ce qu'il y a une méthode pour interdire à l'utilisateur d'intervertir les colonnes ?
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