Bonjour,
je rencontre un petit soucis avec une JTable (aaahhh, quelle source d'ennui ces JTable ^^').
Voici la situation :
Ma JTable contient 3 colones. La 1ère est un bouton et les 2 autres sont du texte.
Pour afficher un bouton dans la 1ère colone j'ai créé une classe ButtonEditors qui extends AbstractCellEditor et une classe ButtonRenderers qui extends DefaultTableCellRenderer.
Jusque là tout se passe bien.
Quand on clique sur le bouton, je veux que ça supprime la ligne en question.
Pour cela j'ai passé la référence de la table à mon ButtonEditors, je choppe le model de la table et je fais un remove sur l'indice correspondant (*).
Quand on le fait une fois, ça marche, mais à la 2ème ça ne fonctionne plus.
La méthode table.getSelectedRow() renvoie -1, car le clique sur le bouton ne sélectionne pas la ligne.
Pour remédier à ce problème j'ai ajouté la ligne suivante, juste après la suppression : table.getSelectionModel().setSelectionInterval(row, row);
Du coup après avoir supprimé la ligne sélectionnée, ça resélectionne la même ligne. Ok, d'ailleurs si je clique sur le bouton Supprimer de la lignes sélectionnée, ça supprime bien. Mais si je clique sur le bouton d'une autre ligne, ça sélectionne cette nouvelle ligne, sans supprimer. Je suis obligé de cliquer 2x :-\
Et c'est là que ça coince, je ne trouve pas comment contourner ce problème.
Pouvez-vous m'aider à passer outre ce comportement, svp ?
Merci d'avance
Pumbaa
P.S. Si vous avez des conseils autres qu'une réponse directe (comme par exemple changer l'architecture de mon programme au niveau de (*), je suis preneur aussi ;-))
Voici mon code
ButtonEditors
ButtonRenderers
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 import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractCellEditor; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.table.TableCellEditor; public class ButtonEditors extends AbstractCellEditor implements TableCellEditor, ActionListener { public ButtonEditors(JTable table) { this.button = new JButton(); this.button.addActionListener(this); this.table = table; super.cancelCellEditing(); } /** * Handles events from the editor button and from * the dialog's OK button. */ public void actionPerformed(ActionEvent e) // TODO ne marche pas très bien quand on supprime plusieurs questions de suite. { QuestionModels model = (QuestionModels)this.table.getModel(); int row = this.table.getSelectedRow(); if(row == -1) return; model.removeRow(row); this.table.getSelectionModel().setAnchorSelectionIndex(row); this.table.getSelectionModel().setLeadSelectionIndex(row); this.table.getSelectionModel().setSelectionInterval(row, row); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return this.button; } @Override public Object getCellEditorValue() { return ""; } private JButton button; private JTable table; private static final long serialVersionUID = 2738468144252049166L; }
Main
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 import java.awt.Component; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; public class ButtonRenderers extends DefaultTableCellRenderer implements TableCellRenderer { public ButtonRenderers() { this.button = new JButton(); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); return this.button; } private JButton button; private static final long serialVersionUID = -4745357073221895808L; }
QuestionModels
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 import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JTable; public class Main extends JFrame { public Main() { QuestionModels model = new QuestionModels(); for(int i = 0; i < 10; i++) model.addRow(new Questions("question "+i, "réponse "+i)); JTable table = new JTable(model); table.getColumnModel().getColumn(0).setCellRenderer(new ButtonRenderers()); table.getColumnModel().getColumn(0).setCellEditor(new ButtonEditors(table)); Container panel = super.getContentPane(); panel.setLayout(new BorderLayout()); panel.add(table, BorderLayout.CENTER); super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); super.setVisible(true); super.pack(); } public static void main(String[] args) { new Main(); } }
Questions
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 import java.util.ArrayList; import javax.swing.JButton; import javax.swing.table.AbstractTableModel; public class QuestionModels extends AbstractTableModel { /* ------------------------------------------------------------ *\ |* Constructeur *| \* ------------------------------------------------------------ */ public QuestionModels() { this.listQuestions = new ArrayList<Questions>(10); } /* ------------------------------------------------------------ *\ |* Méthodes publiques *| \* ------------------------------------------------------------ */ public void addRow(Questions question) { this.insertRow(this.listQuestions.size(), question); } public void insertRow(int row, Questions question) { this.listQuestions.add(row, question); super.fireTableRowsInserted(row, row); } public void removeRow(int index) { this.listQuestions.remove(index); super.fireTableRowsDeleted(index, index); } public void removeRow(Questions question) { int index = this.listQuestions.indexOf(question); if(index < 0) return; this.removeRow(index); super.fireTableRowsDeleted(index, index); } public void clear() { int nbLines = this.listQuestions.size(); this.listQuestions.clear(); super.fireTableRowsDeleted(0, nbLines); } /* ----------------------------- *\ |* Get *| \* ----------------------------- */ @Override public int getColumnCount() { return columnNames.length; } @Override public int getRowCount() { return this.listQuestions.size(); } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public Class<?> getColumnClass(int column) { switch(column) { case 0 : return JButton.class; default : return String.class; } } @Override public Object getValueAt(int row, int column) { Questions question = this.listQuestions.get(row); switch(column) { case 0: return row+1; case 1: return question.getQuestion(); case 2: return question.getAnswer(); default: return null; } } @Override public boolean isCellEditable(int row, int colum) { return true; } /* ------------------------------------------------------------ *\ |* Attributs privés *| \* ------------------------------------------------------------ */ private ArrayList<Questions> listQuestions; /* ------------------------------------- *\ |* Statiques *| \* ------------------------------------- */ private static final String[] columnNames = { "#", "Question", "Réponse" }; private static final long serialVersionUID = 5906888538680435549L; }
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 import java.util.ArrayList; public class Questions { public Questions(String question, String answer) { this.question = question; this.answer = answer; } public Questions(Questions questionnaire) { this(questionnaire.getQuestion(), questionnaire.getAnswer()); } public String getQuestion() { return this.question; } public void setQuestion(String question) { this.question = question; } public String getAnswer() { return this.answer; } public void setAnswer(String answer) { this.answer = answer; } @Override public String toString() { return QUESTION_DELIMITER+this.question+ANSWER_DELIMITER+this.answer; } @Override public boolean equals(Object questionnaire) { if(questionnaire == null) return false; if(questionnaire instanceof Questions) { Questions q = (Questions)questionnaire; return this.question.equals(q.getQuestion()) && this.answer.equals(q.getAnswer()); } return false; } /** * Check if 'this' is contained in an array of Question * @param questions The array * @return */ public boolean isContained(ArrayList<Questions> questions) { for(Questions question:questions) if(question.equals(this)) return true; return false; } private String question; private String answer; public static final String TEXT_QUESTION = "Entrez la question"; public static final String TEXT_ANSWER = "Entrez la réponse associée"; public static final String QUESTION_DELIMITER = "|Q|"; public static final String QUESTION_DELIMITER_REGEX = Questions.QUESTION_DELIMITER.replaceAll("\\|", "\\\\|"); public static final String ANSWER_DELIMITER = "|R|"; public static final String ANSWER_DELIMITER_REGEX = Questions.ANSWER_DELIMITER.replaceAll("\\|", "\\\\|"); }
Partager