2010-11-02 13 views
5

Problema: Necesito una tabla SWT (JFace TableViewer) con altura de fila variable. De hecho, resolví esto en mi máquina de desarrollo (ejecutando Ubuntu 10.10). Desafortunadamente, esto no funciona en Windows ni en Mac.SWT Tabla con altura de fila variable: trabajando en Linux, pero no Mac/Windows

Inicialmente, pensé que no usé las bibliotecas correctamente. Pero ahora me temo que lo que quiero hacer simplemente no es posible en Windows. Espero que alguien aquí me convenza de lo contrario.

Para reproducir: en lugar de proporcionar mi código aquí, construí un programa mínimo para reproducir el problema. Empecé con la siguiente Snipplet:

http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet049StyledCellLabelProvider.java

he modificado el método de actualización() para producir dos líneas de texto para los directorios y una línea para archivos (para simular un entorno con alturas de las filas variables):

... 
if (file.isDirectory()) { 
    cell.setText(styledString.toString() + "\n" 
     + styledString.toString()); 
    cell.setImage(IMAGE1); 
} else { 
    cell.setImage(IMAGE2); 
} 
...

Esto funciona según lo previsto en Linux, pero en Windows todas las filas tienen la misma altura. Específicamente, solo una línea es visible.

A continuación, intenté ayudar a SWT haciendo que measure() fuera más inteligente. Así Reescribí medida() así:

protected void measure(Event event, Object element) { 
    if (((File) element).isDirectory()) { 
     event.height = 32; 
    } else { 
     event.height = 16; 
    } 
    super.measure(event, element); 
}

El resultado: Todas las filas tienen la altura 32. Una vez más, esto funciona como se pretende en Linux.

Mi temor es que en Windows simplemente todas las filas deben tener la misma altura. Esto sería un disparate para mí. ¿Alguien puede confirmar esto, o incluso mejor, proporcionar una solución alternativa?

Gracias!

+0

En realidad, podría haber encontrado una explicación para este comportamiento, y tal vez incluso una solución (todavía tengo que probar esto): https://bugs.eclipse.org/bugs/show_bug .cgi? id = 148039 – jastram

+0

Gracias a todos por las respuestas. Terminé usando http://sourceforge.net/projects/agilegrid/, que también dibuja la tabla de forma nativa, como KTable. Es un placer trabajar con él, sin duda comparado con SWT. – jastram

Respuesta

2

Puedo confirmar que en Win32 las filas de la tabla solo pueden tener la misma altura. Ver por ejemplo this bug report. La solución del error 148039 hace que setItemHeight() sea accesible, pero eso no cambia esta restricción.

4

También encontré este problema: necesitaba un widget de mesa SWT que pudiera admitir celdas de diferentes alturas. Como dice the.duckman, las filas de la tabla Win32 no pueden hacer esto. Terminamos usando el widget KTable. No usa las tablas nativas del sistema operativo.

http://sourceforge.net/projects/ktable/

Se trabajó bien para nosotros, pero tiene algunas peculiaridades. Afortunadamente, el código fuente es bastante fácil de modificar para satisfacer sus necesidades.

+0

Esto se ve realmente interesante.Si aún no hubiera refabricado con AgileGrid, le daría una oportunidad a Ktable. – jastram

1

Utilizamos el widget Nebula Grid. http://www.eclipse.org/nebula/widgets/grid/grid.php

Es excepcionalmente flexible. En nuestro caso, lo usamos para obtener más funcionalidad de tabla de estilo html combinada con un widget treeViewer.

pantalla alt text

+0

¿Estás seguro de que Nebula resuelve este problema? Creo que lo compré y lo rechacé. No estoy seguro si el clima lo rechacé porque estaba en ALPHA, o porque también tenía las limitaciones de altura de la fila. Pero creo * que fue por problemas de altura de hileras también. – jastram

+0

Para obtener las alturas variables no está completamente fuera de la caja, pero es muy sencillo. Cada fila en la cuadrícula tiene su propio atributo de altura independiente. Entonces, como en paint/measure en un widget de tabla normal puede ajustar la altura, pero todos los elementos de tabla ahora son de altura máxima en Grid, puede ajustar cada GridItem.setHeight(). En mi caso, estoy usando el visor de tablas de la grilla y, al tener el método de actualización de mi proveedor de etiquetas, calculo la altura adecuada para cada fila. Es Beta, pero ha sido muy estable para nosotros durante los últimos 2 años más o menos. – fisherja

Cuestiones relacionadas