/ / Clasificación de las vistas y filtrado: clasificación y filtrado de GlazedList + lista de eventos de JTable vs Glazed + JXTable - java, swing, jtable, glazedlists, jxtable

Clasificación y filtrado de vistas: clasificación y filtrado de GlazedList + lista de eventos de JTable vs Glazed + JXTable - java, swing, jtable, glazedlists, jxtable

Quiero crear vistas de usuario (tablas) con capacidades de clasificación y filtrado. Yo uso EventList (Listas Esmaltadas) como fuente para EventTableModel. También hay una lista ordenada y algunos elementos de filtrado en GlazedLists, por lo que puedo usarlos para crear vistas. Pero encontré JXTable y tiene métodos para clasificar y filtrar, y así es como quiero que funcione: la clasificación y el filtrado deben proporcionar un componente de UI y el modelo solo puede contener datos:

EventList<Item> source=new BasicEventList<Item>();
TableModel model=new DefaultEventTableModel<Item>(source,tableFormat); // It"ll be
//perfect if I could create model without tableFormat,
//because it"s presentation of data,
//but in GlazedLists I can"t :( ...
JTalbe ui=new JXTable(model); // UI with sorting and filtering

Pero GlazedLists también proporciona SortedList (decorador para EventList con clasificación) y algunos métodos de filtrado.

EventList<Item> source=new BasicEventList<Item>();
SortedList<Item> sortedSource=new SortedList<Item>(source,comparator);
TableModel model=new DefaultEventTableModel<Item>(sortedSource,tableFormat);
// model with sorting... not very beautifull for me, but what do you think?

JTable ui=new JTable(model); // UI with sorting provided by model

Y la pregunta es: qué modelo es mejor. O tal vez ambos están equivocados, ¿y qué usan para crear vistas?

Respuestas

0 para la respuesta № 1

Yo voto por GlazedLists, porque funciona. Sí, el TableModel que utiliza con la tabla está estrechamente relacionado con la vista, pero desacoplar ese modelo de tabla de sus datos de origen.

Las características de clasificación y filtrado de GlazedLists sonmucho más flexible que el de JXTable. Solo asegúrate de que no los tengas encendidos, o las cosas se pondrán confusas. Aquí está mi fragmento de código habitual para usar una lista de clasificación con un JXTable:

private <T> EventTableModel<T> setupTable(JXTable table, TableFormat<T> tf, EventList<T> displayItems, SortedList<T> sortedItems)
{
table.setColumnControlVisible(true);
table.setSortable(false);
table.getTableHeader().setDefaultRenderer(new JTableHeader().getDefaultRenderer());
table.setAutoCreateRowSorter(false);
table.setRowSorter(null);

EventTableModel<T> etm = new EventTableModel<T>(displayItems, tf);
table.setModel(etm);

TableComparatorChooser.install(table, sortedItems, AbstractTableComparatorChooser.SINGLE_COLUMN);
return etm;
}

Lo que esto hace:

  • encienda el gadget selector de columnas en la parte superior derecha del JXTable
  • desactiva la clasificación incorporada de JXTable
  • instalar las funciones de clasificación de GlazedLists "en su lugar
  • configure la tabla con un EventTableModel derivado de TableFormat

Tenga en cuenta que usted pasa en dos EventLists, un displayItems que es la lista enel final de la canalización, y una lista ordenada que se usa para controlar qué columna se usa para la clasificación, que puede ser anterior en la canalización que la lista de elementos de visualización. (Si su último elemento es la lista ordenada, sin ningún procesamiento después de eso, simplemente pase la lista dos veces).


1 para la respuesta № 2

En caso de que uses el DefaultEventTableModelTodo está bien. A medida que el modelo registra clasificadores en la fuente EventList. Se realiza internamente como en su segundo listado. En el caso de que registre los clasificadores manualmente, entonces tiene que implementar todo el código para cambiar el comparador (por ejemplo, asc, desc). Cuando intente usar el filtrado, es el mismo, pero El JXTable imho no admite un mecanismo para esto, por lo que debe hacerlo a su manera.