Est-il possible de faire ceci avec 1 JTable :
genre agrandir la hauteur d'une ligne selon la taille du champ
si oui, cmt?
Est-il possible de faire ceci avec 1 JTable :
genre agrandir la hauteur d'une ligne selon la taille du champ
si oui, cmt?
A mon avis oui.
Voici en tout cas un bon point de départ: http://java.sun.com/docs/books/tutor...nts/table.html
J'ai déjà un peu travaillé avec les JTables et c'est très puissant.
peut-être qu'il faut que je change le type de données du champ désignation?
Bonjour
Ce code fait varier la hauteur de lignes en fonction de ce quelles contiennent... Dans mon exemple, ce calcul de hauteur est totalement arbitraire...
Mais ce n'est pas tout, les renderers par défaut ne font pas retour a la ligne....
Ce n'est pas tres dur a faire... il suffit je pense d'utiliser des JLabel avec du HTML....
Cordialement,
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 import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; /** * Classe Ex1 */ public class Ex1 extends JFrame{ public static String titres[]={"col1","col2","col3","col4"}; public static String valeurs[][]={ {"valeur 1","valeur 2","valeur 3","valeur 4"}, {"valeur 5","valeur 6","valeur 7","valeur 8"}, {"valeur 9","valeur 10","valeur 11","valeur 12"}, {"valeur 13","valeur 14","valeur 15","valeur 16"} }; public static class Modele extends AbstractTableModel { /* (non-Javadoc) * @see javax.swing.table.TableModel#getColumnCount() */ public int getColumnCount() { return titres.length; } /* (non-Javadoc) * @see javax.swing.table.TableModel#getRowCount() */ public int getRowCount() { return valeurs.length; } /* (non-Javadoc) * @see javax.swing.table.TableModel#isCellEditable(int, int) */ public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } /* (non-Javadoc) * @see javax.swing.table.TableModel#getColumnClass(int) */ public Class getColumnClass(int columnIndex) { return String.class; } /* (non-Javadoc) * @see javax.swing.table.TableModel#getValueAt(int, int) */ public Object getValueAt(int rowIndex, int columnIndex) { return valeurs[rowIndex][columnIndex]; } /* (non-Javadoc) * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int) */ public void setValueAt(Object aValue, int rowIndex, int columnIndex) { valeurs[rowIndex][columnIndex]=aValue.toString(); fireTableDataChanged(); // Signal que les valeurs ont change } /* (non-Javadoc) * @see javax.swing.table.TableModel#getColumnName(int) */ public String getColumnName(int columnIndex) { return titres[columnIndex]; } } public static class Table extends JTable{ public Table(){ super(new Modele()); // avec cette initialisation l'instance fait partie des listener de TableModelEvent setAutoResizeMode(JTable.AUTO_RESIZE_OFF); getTableHeader().setResizingAllowed(false); } /* * Declenché lors d'un changement de valeurs dans le modele */ public void tableChanged(TableModelEvent e) { super.tableChanged(e); TableColumnModel modelecolonne=getColumnModel(); TableModel modele=getModel(); int total=getRowCount(); for(int i=0;i<total;i++){ int taille=0; int total2=modelecolonne.getColumnCount(); for(int j=0;j<total2;j++){ // Partie determinant la taille de la cellule de ligne i et de colonne j int taille2=modele.getValueAt(i,j).toString().length()*2+10; // determination arbitraire if(taille2>taille){ taille=taille2; } } setRowHeight(i,taille); } } } public Ex1(){ super(""); getContentPane().add(new JScrollPane(new Table())); setSize(320,200); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String args[]) { new Ex1(); } }
PS : N'oublie pas le tag [Résolu] (en cliquant sur http://pouiller.eclipse.free.fr/avatar/resolu.gif), si ton problème est résolu...
Regarde au niveau des CellRenderer, TableRenderder, ... Si je me souviens bien, il y a des exemples dans le tutorial SUN.
mais si je met 1 phrase qui dépasse c'est ok qu'il agrandi en hauteur la ligne mais le mot n'est pas mis sur plusieurs lignes, il met des ... à la place
car ds l'exemple il met plusieurs phrases dans la même cellule
Bonjour,
Il faut calculer les longueurs avec FontMetrics des chaines de caractères afin
de determiner les points de retour de ligne et d'utiliser des JLabel et du HTML
(retour a la ligne <BR/>) ou d'implementer un renderer qui realisera ces retour a la ligne...
Pour info les renderer sont des objets qui permettent le rendu d'une cellule...
Cordialement,
PS : N'oublie pas le tag [Résolu] (en cliquant sur http://pouiller.eclipse.free.fr/avatar/resolu.gif), si ton problème est résolu...
Je pense que si tu cherches au niveau des TableCellRenderer, tu devrais trouver ton bonheur.
Tu peux aussi regarder au niveau des exemples. Dans mon install sous <java-sdj-install>/demo/jfc/SwingSet2, il y a un exemple de JTable assez complet (il me semble).
encore 1 précision, pour faire la comparaison, c'est comme en Excel, quand on veut écrire dans une cellule et on la configure avec Renvoi automatique à la ligne pour le texte, et ainsi quand le texte dépasse la largeur de la colonne c'est la hauteur qui est changée, pour faire 1 cellule multiligne...
j'espère qu'avec cela vous pourrez mieux comprendre...
je viens de matter ça, c'est vraiment bien fait, mais cela ne fait pas encore mon bonheur
ah bon ?
Il me semble que le TableCellRenderer peut renvoyer n'importe quoi (un Component) et donc aussi un JPanel ou JLabel avec du code HTML et pourquoi pas avec des <br>...
Ce n'est peut-être pas triviale comme implémentation, mais je pense que c'est la solution. Il faut probablement réimplémenter plusieurs méthodes, mais cela devrait fonctionner. non ? Quelqu'un a déjà utiliser les TableCellRenderer ?
Bonjour,
J'ai déjà implémenter ce genre de choses...
Les JTable sont quelquechose de fantastiques mais assez complexes...
Tu peux faire a peu pres n'importe quoi mais c'est pas toujours tres evident
et ca demande du temps (pour la realisation et pour trouver le moyen de le faire)...
Je m'étais servi du livre
Swing la synthèse : Développement des interfaces graphiques en Java de Dunod
http://java.developpez.com/livres/#L2100081799
Perso, j'ai trouve que c'etait un tres bon livre
Je peux egalement te proposer de participer au sondage sur les tutorials desires... On sait jamais ??!!
Cordialement,
PS : N'oublie pas le tag [Résolu] (en cliquant sur http://pouiller.eclipse.free.fr/avatar/resolu.gif), si ton problème est résolu...
Oui, le principe est assez simple. C'est une interface demandant d'implémenter une méthode retournant un composant graphique qui sera affiché dans la cellule du tableau. Le renderer par défaut s'appuie sur un JLabel, mais pour avoir du multiligne, tu peux utiliser par exemple un JTextArea comme renderer.Quelqu'un a déjà utiliser les TableCellRenderer ?
Bon, voici un point de départ (pas testé) :
Bon, c'est à compléter. Il faut par exemple changer le fond du composant s'il est sélectionné (isSelected), ou faire un setLineWrap(true) sur le textArea. Mais c'est une base de départ.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public class MultilineCellRenderer implements TableCellRenderer { private JTextArea textArea; public MultilineCellRenderer() { textArea = new JTextArea(); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { textArea.setText(value.toString()); return textArea(); } }
je vien de tester mais je suis caller pour l'implémenter sur ma jtable...
cmt je dois faire pour appeler la classe que tu m'a passé?
Après maintes recherches et tests, j'y suis arrivé, mtn je sais affiché +ieurs lignes dans 1 cellule,
je passes le code, cela peut toujours servir, car cela m'a servit
1er fichier MultiLineCellEditor .java (édition de la cellule):
2e fichier :MultiLineCellRenderer
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 import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import javax.swing.*; public class MultiLineCellEditor extends AbstractCellEditor implements TableCellEditor { MyTextArea textArea; JTable table; public MultiLineCellEditor(JTable ta) { super(); table = ta; // this component relies on having this renderer for the String class MultiLineCellRenderer renderer = new MultiLineCellRenderer(); table.setDefaultRenderer(String.class,renderer); // JOptionPane.showMessageDialog(null,"jui ds l'editor","h",JOptionPane.INFORMATION_MESSAGE); textArea = new MyTextArea(); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); for(int i=0;i<table.getRowCount();i++) updateRow(i); } /** This method determines the height in pixel of a cell given the text it contains */ private int cellHeight(int row,int col) { if (row == table.getEditingRow() && col == table.getEditingColumn()) return textArea.getPreferredSize().height; else return table.getDefaultRenderer(String.class).getTableCellRendererComponent(table, table.getModel().getValueAt(row,col),false,false,row,col).getPreferredSize().height; } void cellGrewEvent(int row,int column) { updateRow(row); } void cellShrankEvent(int row,int column) { updateRow(row); } void updateRow(int row) { int maxHeight = 0; for(int j=0;j<table.getColumnCount();j++) { int ch; if ((ch = cellHeight(row,j)) > maxHeight) { maxHeight = ch; } } table.setRowHeight(row,maxHeight); } public Object getCellEditorValue() { return textArea.getText(); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { textArea.setText(table.getValueAt(row,column).toString()); textArea.rowEditing = row; textArea.columnEditing = column; textArea.lastPreferredHeight = textArea.getPreferredSize().height; return textArea; } class MyTextArea extends JTextArea implements KeyListener { int lastPreferredHeight = 0; int rowEditing; int columnEditing; MyTextArea() { addKeyListener(this); // This is a fix to Bug Id 4256006 addAncestorListener( new AncestorListener(){ public void ancestorAdded(AncestorEvent e){ requestFocus(); } public void ancestorMoved(AncestorEvent e){} public void ancestorRemoved(AncestorEvent e){} }); } public void keyPressed(KeyEvent e) {} public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) { if (getPreferredSize().getHeight() > lastPreferredHeight) { lastPreferredHeight = getPreferredSize().height; cellGrewEvent(rowEditing,columnEditing); // this will trigger the addition of extra lines upon the cell growing and // prevent all the text being lost when the cell grows to the point of requiring // scrollbars table.setValueAt(getText(),rowEditing,columnEditing); } else if (getPreferredSize().getHeight() < lastPreferredHeight) { lastPreferredHeight = getPreferredSize().height; cellShrankEvent(rowEditing,columnEditing); } else if (table.getValueAt(rowEditing,columnEditing).equals("")) table.setValueAt(getText(),rowEditing,columnEditing); } } }
et pour tester :
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 import javax.swing.*; import javax.swing.table.*; import java.awt.*; public class MultiLineCellRenderer extends JTextArea implements TableCellRenderer { public MultiLineCellRenderer() { setEditable(false); setLineWrap(true); setWrapStyleWord(true); } public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof String) { setText((String)value); // set the table's row height, if necessary //updateRowHeight(row,getPreferredSize().height); } else setText(""); return this; } }
voilà je vous laisses comprendre le code
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 import javax.swing.*; import javax.swing.table.*; import javax.swing.border.*; import java.util.*; public class MultiLineCellExample { public static void main(String[] args) { JFrame f = new JFrame(); DefaultTableModel dm = new DefaultTableModel() { public Class getColumnClass(int columnIndex) { return String.class; } }; // dm.setDataVector(new Object[][]{{"aa","bb","cc"}, // {"A\nA","B\nB","C\nC"}}, // new Object[]{"1","2","3"}); dm.setDataVector(new Object[][]{{"aa\na","bb","cc"}}, new Object[]{"1","2","3"}); JTable table = new JTable( dm ); MultiLineCellEditor editor = new MultiLineCellEditor(table); table.setDefaultEditor(String.class,editor); JScrollPane scroll = new JScrollPane( table ); f.getContentPane().add( scroll ); f.setSize( 400, 400 ); f.setVisible(true); } }
a+
SAlut,
J'ai testé le code , ca marche bien
Par contre, si on veut un retour à la ligne automatique lorsqu'on construit notre JTable, on est obligé de mettre dans la chaine la valeur \n, autrement, le renderer ne coupe pas automatiquement la chaine par rapport à la longueur de la ligne à la construction.
De plus, utilisé un JTextArea permet de gérer le \n dans la cellule, mais je me rend compte que si on redimensionne une colonne dynamiquement, le renderer ajustre le texte par rapport à la hauteur de la ligne: en gros si on reduit trop la largeur de la colonne, on ne va pas augmenter lahauteur de la ligne pour prendre en compte tout le texte
(sauf lorsqu'on insere du texte!)
Comment rémedier à cela?
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