Bonjour,
Comment récupérer la valeur saisie par l'utilisateur ?
Je souhaite savoir ce qu'il vient de taper pour mettre le texte en majuscules et faire d'autres choses avec.
Merci.
Bonjour,
Comment récupérer la valeur saisie par l'utilisateur ?
Je souhaite savoir ce qu'il vient de taper pour mettre le texte en majuscules et faire d'autres choses avec.
Merci.
Et la javadoc, alors ?
Voici la solution
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Que la force de la puissance soit avec le courage de ta sagesse.
Salut,
Merci pour l'aide mais j'ai une exception
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementAt(Vector.java:430)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
at Tableau.tableChanged(Tableau.java:89)
at javax.swing.JTable.setModel(JTable.java:3626)
at javax.swing.JTable.<init>(JTable.java:611)
at javax.swing.JTable.<init>(JTable.java:539)
at Tableau.<init>(Tableau.java:14)
at FenetrePrincipale.<init>(FenetrePrincipale.java:19)
at MainClass$1.run(MainClass.java:23)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
BUILD SUCCESSFUL (total time: 1 second)
Voici le code de ma classe :
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 import java.awt.Font; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; class Tableau extends JTable implements TableModelListener { public Tableau(){ getModel().addTableModelListener(this); this.setModel(new DefaultTableModel(new Object[][]{ {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null} }, new String [] { "<html><bold><H3>HEURE", "<html><bold><H3>RECETTE", "<html><bold><H3>NOMBRE", "<html><bold><H3>RELIQUATS", "<html><bold><H3>TOTAL", "<html><bold><H3>NB CONT", "<html><bold><H3>NB BU", "<html><bold><H3>GROUPE" } )); this.setFont(new Font("SANS SERIF", Font.BOLD, 16)); DefaultTableCellRenderer custom = new DefaultTableCellRenderer(); custom.setHorizontalAlignment(JLabel.CENTER); for (int i=0 ; i<this.getColumnCount() ; i++) { this.getColumnModel().getColumn(i).setCellRenderer(custom); } for (int i = 0; i < 8; i++) { TableColumn col = this.getColumnModel().getColumn(i); col.setPreferredWidth(100); this.getColumnModel().getColumn(i).setResizable(false); this.tableHeader.setReorderingAllowed(false); } this.setRowSelectionAllowed(false); this.setRowHeight(28); } @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); // A suivre... } }
Même si je laisse le corps de la fonction TableChanged vide, j'ai l'exception.
C'est un problème de débordement du tableau.
J'avoue que je suis un peu paumé là.
Salut,
Voici un exemple.
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 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; public class Tableau { public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Object[][] donnees = { { "Swing", "Astral", "standard", Color.red, Boolean.TRUE }, { "Swing", "Mistral", "standard", Color.yellow, Boolean.FALSE }, { "Gin", "Oasis", "standard", Color.blue, Boolean.FALSE }, { "Gin", "boomerang", "compétition", Color.green, Boolean.TRUE }, { "Advance", "Omega", "performance", Color.cyan, Boolean.TRUE }, }; String[] titreColonnes = { "marque", "modèle", "homologation", "couleur", "vérifiée ?" }; JTable jTable1 = new JTable(donnees, titreColonnes); jTable1.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel) e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); System.out.println("Colone '" + columnName + "', ligne " + row + " : newValue -> \"" + data+"\""); } }); f.add(new JScrollPane(jTable1)); f.pack(); f.setVisible(true); } }
Tu me postes un code mais je préfèrerais des explications plutôt car là ça ne m'aide pas beaucoup.
Mais je te remercie tout de même.
J'ai changé le constructeur de mon Tableau pour "coller" à ton exemple :
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 import java.awt.Font; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; class Tableau extends JTable implements TableModelListener { public Object[][] donnees = { {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, }; public String[] enTetes = { "<html><bold><H3>aa", "<html><bold><H3>bb", "<html><bold><H3>ccE", "<html><bold><H3>dd", "<html><bold><H3>ee", "<html><bold><H3>ff", "<html><bold><H3>gg", "<html><bold><H3>hh" }; public Tableau(Object[][] donnees, String[] enTetes){ getModel().addTableModelListener(this); this.setFont(new Font("SANS SERIF", Font.BOLD, 16)); DefaultTableCellRenderer custom = new DefaultTableCellRenderer(); custom.setHorizontalAlignment(JLabel.CENTER); for (int i=0 ; i<this.getColumnCount() ; i++) { this.getColumnModel().getColumn(i).setCellRenderer(custom); } for (int i = 0; i < 8; i++) { TableColumn col = this.getColumnModel().getColumn(i); col.setPreferredWidth(100); this.getColumnModel().getColumn(i).setResizable(false); this.tableHeader.setReorderingAllowed(false); } this.setRowSelectionAllowed(false); this.setRowHeight(28); this.setVisible(true); } @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); // A suivre... } }
Mais comment déclarer le tableau ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part private Tableau tableau = new Tableau(ICI);
Dois-je obligatoirement créer une classe qui étend AbstractTableModel pour ensuite remplir ma Jtable avec ce modèle ou puis-je m'en passer ?
Je précise que le tableau sera rempli "manuellement" par l'utilisateur (comme un tableau Excel).
Ensuite je devrais à chaque saisie vérifier le format, mettre en majuscules certaines saisies ou encore réaliser un calcul avec le nombre saisi dans une colonne pour afficher le résultat dans une autre colonne.
Mes différents tests pour récupérer une valeur ou afficher du texte dans une cellule (par appui sur un bouton par exemple) fonctionnent sans problème.
Le soucis est vraiment sur la ligne :
Pourquoi je déborde du tableau en mettant ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part public void tableChanged(TableModelEvent e)
Merci.
Du nouveau. J'ai fait ceci :
J'ai un dépassement de pile :
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 this.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); String tt = data.toString(); model.setValueAt(tt, row, column); // cette ligne pose problème } });
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
bah :
- tu récupère l'événement de changement de valeur
- tu fais ton traitement
- tu fais un setValueAt() <--- qui a pour conséquence de changer la valeur de ta cellule et donc d'appeler ton tableChanged()
- tu repars au premier tiret.
- ...
- stak over flow.
C'est une "boucle infinie".
pourquoi tu repositionnes la valeur dans ta table avec exactement la même valeur ???? (ouais convertie en string mais c'est pareil) quand tu détectes un changement dans celle-ci ?
Si tu veux un rendu en String dans cette colonne c'est pas comme ça qu'il faut faire . Il vaut mieux te surcharger cette méthode
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Object data = model.getValueAt(row, column); model.setValueAt(tt,row,Column);
http://java.sun.com/j2se/1.4.2/docs/...lumnClass(int)
D'accord mais j'ai toujours la même erreur si je fais par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part model.setValueAt("phrase test", row, column);
c'st pas l'exemple qui coince.
C'est le fait que dans ta fonction tableChanged() (qui est appellée à chaque fois qu'il y a un changement dans ta table) tu appelles une fonction qui change ta table. Ce qui a pour conséquence de rapeller tablechanged, qui rapelle ton setValue qui rapelle ton tablechange qui rapelle ton setvalue... etc ... et de manière infinie ... enfin presque parce qu'un moment ta JVM pète et te balance une stackoverflow.
IL ne faut pas faire de setValue dans le tableChanged.
pour répondre à ton pb initial
https://java.sun.com/docs/books/tuto...tml#editrender
la solution se trouve du côté des éditors si on en croie le tutorial (tableau juste en dessous du lien que je t'ai donné).
voilou.
Et je le fais où alors ?
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 this.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); data = data.toString().toUpperCase(); // je veux remettre le texte dans sa cellule } });
avant d'aller plus loin// je veux remettre le texte dans sa cellule
, à quoi ça te sert? tu ne l'as pas "enlevé" de ta cellule.
sinon tu ne fais pas ça dans la fonction tableChanged les éditors pour des tables , je te conseille de suivre les tutos pour les éditors. Ca sera plus simple que des explications .
Je veux remettre le texte après l'avoir mis en majuscules.
exemple tout simple pour les éditors http://www.exampledepot.com/egs/java.../CustEdit.html
tu as la méthode getCellEditorValue qui répond à ton besoin.
Je cherche aussi comment avoir plusieurs traitement différents en fonction de la colonne dans laquelle se situe la cellule dont la valeur a changé.
Si je peut me permettre, je crois que tu ne suis pas un bon chemin pour faire ce que tu veux faire.
Il me semble que l'utilisation d'un DefaultTableCellRenderer est plus indiqué.
Tu as un exemple Sun :
http://java.sun.com/docs/books/tutor....html#renderer
Voici un exemple simple (surement a adapter) qui permet de transformer toutes chaines saisie dans la table en majuscules :
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 import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; public class Tableau { public static Object[][] donnees = { {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null}, }; public static String[] enTetes = { "<html><bold><H3>aa", "<html><bold><H3>bb", "<html><bold><H3>ccE", "<html><bold><H3>dd", "<html><bold><H3>ee", "<html><bold><H3>ff", "<html><bold><H3>gg", "<html><bold><H3>hh" }; public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @SuppressWarnings("serial") JTable jTable1 = new JTable(donnees, enTetes) { @Override public TableCellRenderer getCellRenderer(int row, int column) { return new MonRenderer(); } }; f.add(new JScrollPane(jTable1)); f.pack(); f.setVisible(true); } } @SuppressWarnings("serial") class MonRenderer extends DefaultTableCellRenderer { public MonRenderer() { } public void setValue(Object value) { if (value != null) { if (value instanceof String) { setText(((String)value).toUpperCase()); } } } }
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