Bonjour,
Est il possible de rendre les titres de colonnes cliquable afin d'organiser un tri croissant ou decroissant de la colonne.
Genre Tableau evoluer ...
Bonjour,
Est il possible de rendre les titres de colonnes cliquable afin d'organiser un tri croissant ou decroissant de la colonne.
Genre Tableau evoluer ...
Ya la classe de chez sun :
http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/index.html#TableSorterDemo
MyTableModel c'etait mon modele et table c'est ma JTable :
Sinon t'es pas obligé de lui passé un model, ca peut etre ton seul modele.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 MyTableModel tableModel = new MyTableModel(); TableSorter sorter = new TableSorter(tableModel); table.setModel(sorter); sorter.setTableHeader(table.getTableHeader());
"Quand le sage montre la lune,
L'idiot regarde le doigt."
Alors ta methode marche tres bien merci ...
Mais en fait je crois que je n'est pas tres bien compris le fonctionnement des TableModel.
Actuellement je n'utilise pas de model, et je supprime et recree une nouvelle jTable a chaque fois que je veux en changer son contenu.
Le probleme c'est qu'en ajoutant ton code ca ne fonctionne plus ...
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 public JTable remplirJTable(String requete){ JTable jTable = new JTable(); Vector data = new Vector(); Vector tmp = null; Vector titre = null; DataSet d = _cnx.executeQuery( requete ); while(d.hasMoreElements() ){ data.addElement ( d.nextElement()); } if(data.size() != 0){ titre = new Vector(); for (int i=0; i < ((Vector)(data.elementAt( 0))).size() ; i++){ titre.add( (d.getColumnName( i+1)).toUpperCase()); } } jTable = new JTable(data, titre); //Centrage des String dans les cellules DefaultTableCellRenderer custom = new DefaultTableCellRenderer(); custom.setHorizontalAlignment(JLabel.CENTER); for (int k=0; k < jTable.getColumnCount(); k++) { jTable.getColumnModel().getColumn(k).setCellRenderer(custom); custom.setBackground( new Color(7,10,15,30)); } //Tailles des colonnes if (data.size() != 0){ TableColumn column = null; for (int i = 0; i < 6; i++) { column = jTable.getColumnModel().getColumn(i); if (i == 0) { //column.setPreferredWidth(0); column.setMaxWidth( 0); } else if(i==1){ column.setPreferredWidth(250); }else if (i==5){ column.setPreferredWidth(70); }else if (i == 2){ column.setPreferredWidth(50); } } } //Ajout d'un listener pour capturer les modifications de cellules. jTable.getModel().addTableModelListener(new MyTableModelListener(jTable, _cnx)); return jTable; }
Pourquoi et comment utiliser des modeles :
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
Je te met du code en vrac :
Le panel dans lequel j'ai ma table
la listOfResultat est une collection que je construit, elle contient une serie d'objet qui sont des Node (des objet a moi).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 //attributs de classe JTable table; MyTableModel tableModel; //instanciation dans constructeur ou autre table = new JTable(); tableModel = new MyTableModel(); TableSorter sorter = new TableSorter(tableModel); tableModel.setSorter(sorter); table.setModel(sorter); sorter.setTableHeader(table.getTableHeader()); //methode appelé lors du changement des données de la table : tableModel.setResultatRecherche(listOfResultat);
MyTableModel.java
Mon model qui est un intermediare entre ma table et le TableSorter.
Pas trop le temps de t'expliquer regarde ca et si ya un truc que tu saisi pas dis le moi
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 import javax.swing.table.*; import javax.swing.*; import java.util.*; /** * MyTableModel.java * Le modele du tableau de resultat de la recherche.Classe qui etend de * DefaultTableModel. Ce modele est encapsulé dans un autre modele qui est * un TableSorter. * * @author narfiggo */ public class MyTableModel extends DefaultTableModel{ /* --- Attributs --- */ /** Le TableSorter associé. */ private TableSorter sorter; /** Le tableau des noms de colonnes du modele. */ private String[] columnNames; /** Le nombre de colonne du modele. */ private int numberColumn; /** Le tableau de données du modele, les cellules de la table. */ private Object[][] tableData; /* --- Constructors --- */ /** * Crée une nouvelle instance de la classe. Initailise une table vide avec les noms * de colonnes par defaut par appel de la methode {@link init()}. */ public MyTableModel(){ numberColumn = 4; init(); } /* --- Accessors --- */ /** * Accesseurs en ecriture sur le TableSorter. * * @param sorter Le TableSorter du modele. */ public void setSorter(TableSorter sorter){this.sorter = sorter;} /* --- Methods --- */ /** * Initialise le noms des colonnes par defaut. */ private void init(){ columnNames = new String[numberColumn]; columnNames[0] = "Nom"; columnNames[1] = "Pr\u00e9nom"; columnNames[2] = "Email"; columnNames[3] = "Soci\u00e9t\u00e9"; } /** * Remplit le modele avec la collection de resultat passé en parametre. * * @param listOfResultat La collection permettant de remplir le modele. */ public void setResultatRecherche(Collection listOfResultat){ Iterator iterator = listOfResultat.iterator(); tableData = new String[listOfResultat.size()][numberColumn]; int cpt = 0; while(iterator.hasNext()){ Node node = (Node)iterator.next(); tableData[cpt][0] = node.getNom(); tableData[cpt][1] = node.getPrenom(); tableData[cpt][2] = node.getEmail(); tableData[cpt][3] = ""; cpt++; } fireTableStructureChanged(); } /* --- Redefined from DefaultTableModel --- */ /** * Retourne le nombre de colonnes du modele. * * @return Le nombre de colonnes */ public int getColumnCount(){return columnNames.length;} /** * Retourne le nom de la colonne a la position passée en parametre * * @param col Le numero de la colonne * @return Le nom de la colonne. */ public String getColumnName(int col){return columnNames[col];} /** * Affecte un nouveau nom de colonne avec les données passées en parametre. * * @param name Le nouveau nom de la colonne. * @param i La colonne a modifié. */ public void setColumnName(String name,int i){columnNames[i]=name;} /** * Retourne le nombre de ligne du modele. * * @return Le nombre de ligne. */ public int getRowCount(){ if(tableData != null) return tableData.length; else return 0; } /** * Retourne la valeur de la cellule (l'Objet) a la position "row" et "col". * * @param row La ligne en question * @param col La colonne en question * @return L'Objet correspondant a cette cellule. */ public Object getValueAt(int row, int col){return tableData[row][col];} /** * Determine si la cellule a la position "row" et "col" et editable ou non. * * @param row La ligne en question * @param col La colonne en question * @return True si la cellule est editable, false sinon. */ public boolean isCellEditable(int row, int col) { return false; } }
"Quand le sage montre la lune,
L'idiot regarde le doigt."
Ok nikel avec une petite modif ca marche tres bien chez moi ...
(Remplacement de la collection par un vecteur)
Mais comment centrer les String dans les cellules ? et definir les tailles de cellules ?
Bin tu remet ton renderer sur la JTable :
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 //Centrage des String dans les cellules DefaultTableCellRenderer custom = new DefaultTableCellRenderer(); custom.setHorizontalAlignment(JLabel.CENTER); for (int k=0; k < jTable.getColumnCount(); k++) { jTable.getColumnModel().getColumn(k).setCellRenderer(custom); custom.setBackground( new Color(7,10,15,30)); } //Tailles des colonnes if (data.size() != 0){ TableColumn column = null; for (int i = 0; i < 6; i++) { column = jTable.getColumnModel().getColumn(i); if (i == 0) { //column.setPreferredWidth(0); column.setMaxWidth( 0); } else if(i==1){ column.setPreferredWidth(250); }else if (i==5){ column.setPreferredWidth(70); }else if (i == 2){ column.setPreferredWidth(50); } } }
"Quand le sage montre la lune,
L'idiot regarde le doigt."
Ba oui mais j'aimerai bien que ca soit aussi facile !
Mais ca marche pas ...
Je comprend 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 private void initialize() { laPoste = new ImageIcon(ihm.FPrincipale.class.getResource("images/logo.gif")); imageCaisse = new ImageIcon(ihm.FPrincipale.class.getResource("images/LogoCaisses.gif")); this.setSize(709, 504); this.setContentPane(getJContentPane()); this.setTitle("Tenue de Compte 2004"); //Ajout du TableModel tableModel = new MyTableModel(); TableSorter sorter = new TableSorter(tableModel); tableModel.setSorter(sorter); jTable.setModel(sorter); sorter.setTableHeader(jTable.getTableHeader()); //Centrage des String dans les cellules DefaultTableCellRenderer custom = new DefaultTableCellRenderer(); custom.setHorizontalAlignment(JLabel.CENTER); for (int k=0; k < jTable.getColumnCount(); k++) { jTable.getColumnModel().getColumn(k).setCellRenderer(custom); custom.setBackground( new Color(7,10,15,30)); } //Tailles des colonnes TableColumn column = null; for (int i = 0; i < 6; i++) { column = jTable.getColumnModel().getColumn(i); if (i == 0) { //column.setPreferredWidth(0); column.setMaxWidth( 0); } else if(i==1){ column.setPreferredWidth(250); }else if (i==5){ column.setPreferredWidth(70); }else if (i == 2){ column.setPreferredWidth(50); } } this.addWindowListener(new java.awt.event.WindowAdapter() { public void windowOpened(java.awt.event.WindowEvent e) { jComboBox3.setSelectedIndex( calendar.get(Calendar.MONTH)); remplirJtable(null); } public void windowClosing(java.awt.event.WindowEvent e) { _cnx.close() ; System.exit( 0); } }); }
Depuis que t'as changé le model ca marche plus, ou ca marcher pas avant deja :
Parceqeu apparemment ca marche le renderer que t'as fait, j'ai testé vite fait mais ca a l'air d'etre bon. Chez toi, les cellules ne sont ni centrées, ni grisées :
Par contre c'est possible que ca marche pas si tu rajoute des colonnes apres l'initialisation, faut qu'a elles aussi tu leur applique le renderer...
"Quand le sage montre la lune,
L'idiot regarde le doigt."
Ouf ! Enfin ...
Grand merci, c'est effectivement car je n'appliquait pas le renderer aux nouvelles colonnes !
Je commencai a desesperer ...
Merci a toi narfiggo !!
De nada
Ca fait plaisir de se sentir utile 8)
"Quand le sage montre la lune,
L'idiot regarde le doigt."
Bonjour, j'ai lu votre sujet qui est super pratique et pour cela : grand merci.
le problème c'est que je n'ai pas accès à la méthode "setTableHeader"
que faire ???
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