[JXTable] Probleme lors d'insert filtres
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 plait :) Je 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.
Code:
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 ensuite au niveau de l'ajout dans le modèle cela se passe très simplement comme ça
Code:
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();
} |
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 :(
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 :
Code:
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;
} |
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 :)
Merci beaucoup :),