Tri des colonnes hors table avec des listes vitrées et un JXTable
-
12-11-2019 - |
Question
J'utilise des listes vitrées pour trier et filtrer une JXTable.
Comment puis-je trier les valeurs hors table ?Autrement dit, j'aimerais pouvoir formater les valeurs des colonnes à ma manière, tout en triant les valeurs brutes.
Mon code pertinent actuel :
EventList<Foo> foos = GlazedLists.threadSafeList(new BasicEventList<Foo>());
foos.add(new Foo("bar", 5000000));
ObservableElementList.Connector<Foo> fooConnector = GlazedLists.beanConnector(Foo.class);
EventList<Foo> observedFoos = new ObservableElementList<Foo>(foos, fooConnector);
SortedList<Foo> sortedFoos = new SortedList<Foo>(observedFoos, null);
EventTableModel tableModel = new EventTableModel(sortedFoos, someTableFormat);
JXTable t = new JXTable(tableModel);
new TableComparatorChooser<Foo>(t, sortedFoos, false);
Dans cet exemple, je voudrais formater la valeur de la deuxième colonne comme 5.0M
plutôt que 5000000
, mais si j'utilise cette valeur dans la liste, elle ne sera pas triée correctement.
Merci d'avance.
La solution
Peut-être devez-vous désactiver le tri JXTable pour qu'il n'interfère pas avec le tri GL ?Quelque chose comme:
jxtable.setSortable(false);
jxtable.setAutoCreateRowSorter(false);
jxtable.setRowSorter(null);
...puis installez GlazedLists TableComparatorChooser sur la table comme :
TableComparatorChooser.install(jxtable, sortedFoos, TableComparatorChooser.SINGLE_COLUMN);
Ou voulez-vous dire que vous souhaitez formater 5 000 000 en 5,0 M dans le tableau, pas dans la liste ?Ensuite, il vous suffira d'implémenter votre TableFormat
public Object getColumnValue(E yourObject, int column)
pour renvoyer la représentation 5,0M de 5000000.
...il se pourrait bien que je n'aie pas bien compris le problème et que ces réponses ne m'aident pas ;-)
MODIFIER:Exemple exécutable...
Regardez le code dans la méthode principale - en particulier le code avec le commentaire START-END.J'ai fait mon propre exemple très simple, mais vous devez comprendre ce que je veux dire.
Oh...désolé pour le nom des classes/variables/...;-)
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.EventTableModel;
import ca.odell.glazedlists.swing.TableComparatorChooser;
import java.util.Comparator;
import java.util.List;
import javax.swing.ComboBoxEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import org.jdesktop.swingx.JXTable;
public class Tester {
private static class MyObject implements Comparable<MyObject> {
private final int number;
private final String value;
public MyObject(int number, String value) {
this.number = number;
this.value = value;
}
public int getNumber() {
return number;
}
public String getValue() {
return value;
}
@Override
public int compareTo(MyObject t) {
return value.compareTo(t.getValue());
}
}
private static class MyTableFormat implements TableFormat<MyObject> {
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName(int i) {
switch (i) {
case 0:
return "FormattedNumber";
case 1:
return "String";
default:
throw new IllegalStateException();
}
}
@Override
public Object getColumnValue(MyObject e, int i) {
switch (i) {
case 0:
return getNumberString(e.getNumber());
case 1:
return e.getValue();
default:
throw new IllegalStateException();
}
}
private Object getNumberString(int number) {
switch (number) {
case 1:
return "One";
case 2:
return "Two";
case 3:
return "Three";
default:
throw new IllegalStateException();
}
}
}
private static class MyComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject t, MyObject t1) {
return Integer.valueOf(t.getNumber()).compareTo(Integer.valueOf(t1.getNumber()));
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
EventList<MyObject> list = new BasicEventList<MyObject>();
list.add(new MyObject(1, "A"));
list.add(new MyObject(2, "B"));
list.add(new MyObject(3, "C"));
SortedList<MyObject> sortedList = new SortedList<MyObject>(list);
EventTableModel<MyObject> tableModel = new EventTableModel<MyObject>(sortedList, new MyTableFormat());
JXTable jxtable = new JXTable(tableModel);
/**
* START
* - Deactivate JXTables build-in sorting
* - Install GlazedLists sorting
* - Set the comparator for the "string number" column
*/
// deactivate sorting of JXTable
jxtable.setSortable(false);
jxtable.setAutoCreateRowSorter(false);
jxtable.setRowSorter(null);
// enable GlazedLists sorting
TableComparatorChooser<MyObject> tcc = TableComparatorChooser.install(jxtable, sortedList, TableComparatorChooser.SINGLE_COLUMN);
// set the comparator for your "string number" column
List<Comparator> comparators = tcc.getComparatorsForColumn(0);
comparators.clear();
comparators.add(new MyComparator());
/**
* END
*/
JFrame f = new JFrame("Tester");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(jxtable));
f.pack();
f.setVisible(true);
}
}