Bonjour à tous,
Je travaille sur une JXTable et je rencontre un problème que je n'arrive pas à contourner : j'aurais donc besoin de vos lumières s'il vous plaitJe vais essayer de détailler au maximum. N'hésitez pas à me dire d'en rajouter au besoin,
En fait le problème vient des filtres puisque lorsque je les désactive : l'insert fonctionne correctement.
En gros, lorsque j'insère une nouvelle row en cliquant sur le bouton, la nouvelle ligne est bien ajoutée dans le modèle mais n'apparait pas dans la vue : le "rowModel" ci dessous en correct mais le "rowView" ne l'est pas. Pourtant je désactive bien mes filtres.
Donc ensuite au niveau de l'ajout dans le modèle cela se passe très simplement comme ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 if (action.getSource() == _insertButton) { _controler.addRow(_filterPanel.getFilterColumns()); int rowModel =_table.getModel().getRowCount() - 1; int rowView = _filters.convertRowIndexToView(rowModel); int colEditable = getNextCellEditable(rowView,0); if (rowView == -1) { ErrorPopup.getInstance().showWarning("Row" + rowModel + " can not be displayed"); } }
donc si je désactive les "filtres", que je vais détailler en dessous : aucun problème. Mais dès qu'il y a une ligne vide : c'est le drame
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public void addRow(LinkedHashMap<Integer, Object> linkedHashMap) { //add a new Vector ArrayList<Object> newRow = new ArrayList<Object>(_columns.size()); // set defaultValue to the vector int size = _data.size(); _data.add(size,newRow); setDefaultRowValue(linkedHashMap); fireTableDataChanged(); }
Mes filtres sont visuellement construit comme une liste de panel contenant chacun un bouton, un text et une combobox avec la liste des colonnes. Après quand l'user clique sur le bouton, le filtre est appliqué. (maximum de 5 panels).
Si j'ai bien compris le système des filtres avec la JTable : je crée mes 5 filtres à l'init de ma JTable que je relie à une pipeline, que je relie à ma table. Tout ça une seule et unique fois.
Lorsqu'un filtre change, je joue avec filter.refresh() et je set la colonne à 0, ainsi que le pattern. Est ce que je fais bien ou j'ai raté quelque chose ?
Mes filtres, hors insert, fonctionne relativement bien et ne me posent pas (encore) de problème donc j'ai sans doute fait une erreur à l'init.
Voici ma classe panel qui contient chaque filtre. Elle est englobée par une autre classe qui contient la liste de ces 5 panels :
Bon j'ai élagué au maximum le code pour qu'il reste compréhensible, j'espère que c'est assez clair. Sinon, je serai ravie de redonner plus d'informations
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 public class FilterPanelView extends JXPanel{ private JButton _button; private JTextField _text; private JComboBox _combo; private boolean _isActivated; private PatternFilter _filter; public FilterPanelView(ArrayList<String> columns) { // Vizulation init super(); setLayout(new GridLayout(1,3)); _button = new JButton(IconManipulation.getInstance().getNewRowIcon()); _text = new JTextField(); _combo = new JComboBox(columns.toArray()); _text.setVisible(true); _combo.setBorder(BorderFactory.createEmptyBorder()); _filter = new PatternFilter(); add(_combo); add(_text); add(_button); _isActivated = false; setVisible(true); } public boolean actionPerformed() { // When the user click to add the filter, else do nothing if (_isActivated == false) { _combo.setEditable(false); _combo.setEnabled(false); _text.setEnabled(false); _isActivated = true; if (_text.getText().equalsIgnoreCase("")) _filter.setPattern("", 1); else _filter.setPattern("^" +_text.getText() + "$", 1); _filter.setColumnIndex(_combo.getSelectedIndex()); return true; } return false; } /** Used to clear the filter to be reused */ public void setEmptyPattern() { _filter.setColumnIndex(0); _filter.setPattern(".*",0); _filter.refresh(); _text.setText(""); _combo.setEditable(true); _combo.setEnabled(true); _text.setEnabled(true); _button.setIcon(IconManipulation.getInstance().getNewRowIcon()); _isActivated = false; }
Merci beaucoup,





Répondre avec citation
Partager