JXTable: ¿Cómo consultar el estado en los modelos de columna?
-
27-10-2019 - |
Pregunta
Estoy escribiendo algunos métodos de persistencia de UI para una aplicación. Estoy tratando de expandirme a un JXTable con un conjunto fijo de n columnas en el modelo de tabla.
¿Cómo puedo obtener y establecer la siguiente información para la columna #K en el JXTable, donde K está el número de columna en el orden del modelo de tabla? No es tan fácil como parece, o al menos me falta información difícil.
- ancho de columna
- visibilidad de columna
- orden de columna
TableColumnModelExt.getColumns()
Incluye esta loca nota, que tengo problemas para analizar:
java.util.List<javax.swing.table.TableColumn> getColumns(boolean includeHidden)
Devuelve una lista de Tablecolumns contenidas. Incluye o excluye columnas invisibles, dependiendo de si el incluido incluido es verdadero o falso, respectivamente. Si es falso, un iterador sobre la lista es equivalente a la enumeración devuelta por GetColumns ().
Nota: El orden de las columnas en la lista depende de si las columnas invisibles están incluidas o no, en el primer caso es el orden de inserción en el segundo es el orden actual de las columnas visibles.
Además, sé cómo usar JTable.convertColumnIndexToView()
, pero devuelve -1 para columnas ocultas, y no deja información sobre qué orden iría la columna oculta si fuera visible nuevamente. JXTable conoce esta información porque puede restaurar la visibilidad de la columna, y pone la columna donde estaba antes de que estuviera oculto.
Solución
Si lo entiendo correctamente, está después del índice de la columna de vista, una columna oculta lo habría hecho si se volviera visible nuevamente. Eso no es directamente compatible.
Para fines de guardar/restaurar, hay un clase XProperties (No es oficialmente compatible, pero trabajando sin problemas) Hacerlo en el contexto de AppFramework que podría darle una idea de cómo hacerlo.
Editar
Para obtener una Tablecolumna de ModelIndex, obtenga todas las columnas, bucle y compare el ModelIndex. Algún pseudocódigo en un pseudo método getColumnfor (modelindex):
List allColumns = table.getColumns(true);
forEach {
if (column.getModelIndex() == modelIndex) {
return column;
}
return null;
Otros consejos
Considere usar el Marco de aplicaciones swing (JSR-296)
Aunque este proyecto ahora está muerto AFAIK, creo que es un mejor punto de partida que implementar esta función desde cero. (Es de código abierto).
Si está creando su aplicación en la parte superior de la plataforma NetBeans (que recomiendo encarecidamente), eche un vistazo a mi blog sobre cómo usar estos dos marcos juntos:
http://puces-log.blogspot.com/2009/04/netbeans-platform-meets-swing.html
Nota: también está el Mejor marco de aplicaciones de swing
The Better Swing Application Framework is a fork of the original Swing Application Framework (appframework) reference implementation of JSR 296. Since August 2009, the original Swing Application Framework project has been on hold, and therefore this fork was created to carry on the work until the original project resumes.
No sé mucho sobre esto, pero podría ser incluso un mejor punto de partida.