Clasificación y filtrado de vistas: clasificación y filtrado de GlazedList + JTable vs lista de eventos Glazed + JXTable

StackOverflow https://stackoverflow.com/questions/7833179

Pregunta

Quiero crear vistas de usuario (tablas) con capacidades de clasificación y filtrado.Utilizo EventList ( Glazed Lists ) 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 ordenar y filtrar, y así es como quiero que funcione: la clasificación y el filtrado deben proporcionar un componente de interfaz de usuario 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 de EventList con Sorting) 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 ¿de qué sirve para crear vistas?

¿Fue útil?

Solución

Voto por GlazedLists porque funciona. Sí, el modelo de tabla que usa con la tabla está estrechamente acoplado a la vista, pero desacopla ese modelo de tabla de sus datos de origen.

Las funciones de clasificación y filtrado de GlazedLists son mucho más flexibles que las de JXTable. Solo asegúrate de no tener los dos encendidos o las cosas se volverán confusas. Aquí está mi fragmento de código habitual para usar un SortedList 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;
}

Qué hace esto:

  • active el gadget selector de columnas en la parte superior derecha de JXTable
  • desactivar la clasificación incorporada de JXTable
  • instale las funciones de clasificación de GlazedLists en su lugar
  • configura la tabla con un EventTableModel derivado de TableFormat

Tenga en cuenta que pasa dos EventLists, un displayItems que es la lista al final de la canalización, y un sortedList que se usa para controlar qué columna se usa para ordenar, que puede ser anterior en el pipeline que la lista displayItems. (Si su último elemento es sortedList, sin ningún procesamiento después de eso, simplemente pase la lista dos veces).

Otros consejos

En caso de que utilice DefaultEventTableModel, todo está bien.A medida que el modelo registra clasificadores en la fuente EventList.Se hace internamente como en su segunda lista.En caso de que registre los clasificadores manualmente, entonces debe implementar todo el código para cambiar el comparador (por ejemplo, asc, desc).Cuando se intenta usar el filtrado, es lo mismo, pero JXTable en mi humilde opinión no admite un mecanismo para esto, por lo que debe hacerlo a su manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top