Bonjour à vous développeurs chevronnés
Avant de poser mon problème, mettons nous en situation.
Dans le cadre de mon projet, je dois ouvrir et lire des fichiers textes contenant des bytes que je dois traiter ---> jusque là tout va bien.
Dans mon conteneur, j'affiche ma JTable et 2 boutons de navigation qui me permettent de changer de fichier. --> jusque là, tout va bien aussi.
La relecture se fait donc après le clique sur l'un ou l'autre bouton, respectivement "Précédent" et "Suivant" - vous voyez le genre de navigation.
Ensuite, je souhaite filtrer les données de la table affichée en fonction d'une JComboBox. Et là, des phénomènes étranges arrivent.
Premièrement, lorsque j'ouvre mon fichier initial, mon filtre ne fonctionne pas. Je dois changer le fichier et revenir dessus pour "activer" le filtre.
Je pense qu'il y a problème lors de l'initialisation (cf code en fin de post).
Secondo, j'arrive à filtrer mes données grâce à la comboBox selon mes critères imposés via un regexFilter. Cependant, je n'arrive pas à trouver la bonne expression régulère pour afficher la table "d'origine" dépourvue de filtrage.
J'ai essayé: "*", ".*", " " ...
Pour finir, j'ai un souci entre mon modèle et ma relecture de fichier. En effet, lorsque j'effectue un filtre sur le fichier X qui me renvoie, par exemple, 20 lignes, lorsque je change de fichier, j'ai une erreur qui m'indique le out of bound Exception. Et si je n'ai pas d'erreur et que mon filtre sur le fichier X me renvoie 4 valeurs, ben sur le fichier suivant, j'affiche que 4 valeurs bien que j'ai 10 fois plus de lignes à lire.
Pour complèter mon post, voici quelques lignes de codes:
Mon itialisation de ma table:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 model = new MyTableModel(createDataTable(readIntByte.readByte())); sorter = new TableRowSorter<MyTableModel>(model); tableEvent = new JTable(model); tableEvent.setRowSorter(sorter); //Design du tableau tableEvent.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN); tableEvent.setAutoCreateRowSorter(true);
Mon filtre, établit grâce au site de sun, mais adapté à mes besoins:
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 private void newFilter() { RowFilter<MyTableModel, Object> rf = null; //If current expression doesn't parse, don't update. try { if (choixSelect.equals("Tous")) { rf = RowFilter.regexFilter(".*", 1); } else { rf = RowFilter.regexFilter(choixSelect, 1); } } catch (java.util.regex.PatternSyntaxException e) { return; } sorter.setRowFilter(rf); }
et pour finir, ma relecture:
En espérant que vous pourrrez m'éclaircir les idées
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 private void refreshData() { //Mise à jour du fichier + affichage System.out.println("REFRESH DATA TABLE EVENT<<<<<<<<<<<<<<<<<<<<<<"); tableEvent.removeAll(); //Lecture du fichier System.out.println("EVENT : lecture de " + FILENAME); readIntByte = new TAFTPReadByte(URL, FILENAME, FILE_SIZE); model.setData(createDataTable(readIntByte.readByte())); //Creation de la table tableEvent.setModel(model); tableEvent.setRowSorter(sorter); tableEvent.validate(); tableEvent.repaint(); scrollPane.validate(); scrollPane.repaint(); }
MustOne
Partager