2010-11-23 8 views
10

Similar question, pero no es exactamente lo mismo.Desplaza Programativamente una Tabla SWT horizontalmente

table.showColumn() es útil, pero el desplazamiento solo tiene la granularidad del ancho de la columna. Pero quiero un control más preciso de la ubicación de desplazamiento.

Considere el siguiente caso de uso. Tengo dos tablas que sé que son del mismo ancho y tienen el mismo ancho de columna. Y quiero implementar algún tipo de sincronizador de desplazamiento para que cuando el usuario recorra una tabla (horizontalmente), la otra mesa se desplace a la misma ubicación.

¡Muchas gracias de antemano!

Stackoverflow rocks.

EDIT:

On the Eclipse forum parece que hay la misma pregunta y algunas ideas de trabajo, pero sin resolución.

EDIT: descubrí este comportamiento en Windows

+0

¿Encontró la solución? – Joel

+0

Casi me rindo por – RAY

Respuesta

4

Me temo que no puedo conseguir un resultado satisfactorio en Windows Vista/7 o bien, pero sentí que estaba acercando.

Creo que tendrá que agarrar la barra de desplazamiento horizontal Table usando table.getHorizontalBar(). Luego, puede especificar scrollbar.setSelection() para que se mueva a una posición específica.

Aquí es donde me quedo atascado. De alguna manera, debe notificar al Table o al ScrollBar que el valor ha cambiado. He intentado todo desde update() hasta notifyListener(), pero no hay dados. Parece que solo se trata de diseñar, pero layout() tampoco tiene ningún efecto.

Por cierto, ten en cuenta que el ScrollBar 's padre (tipo Scrollable) no es un ScrolledComposite como yo esperaba, pero en realidad es la misma Table.

Espero que esto le brinde algunas ideas y le ayude a encontrar una solución. Si es así, por favor avíseme, ¡ya que ahora me está molestando!

+0

No creo que la actualización() o el diseño() funcionen. Me parece que setSelection() simplemente mueve el pulgar y no nada sobre la mesa. Esto definitivamente parece un defecto de diseño, pero me pregunto qué podemos hacer al respecto. – RAY

+0

Estoy de acuerdo. Es por eso que estaba tratando de ejecutar un 'notifyListener()', con la esperanza de que pudiera engañar a la barra de desplazamiento para que actualizara la posición horizontal de la tabla en función de la "selección" del pulgar. No dados. Es digno de mención que al cambiar la selección, el desplazamiento de desplazamiento se ensucia: puede desplazarse más allá de los límites de la tabla. Muy extraño de hecho. ¿Tal vez publicar un informe de error en SWT? –

+0

Es un poco arriesgado, pero tal vez fingir un evento de ratón en alguna posición podría hacer esto? No debería ser demasiado difícil obtener el tamaño de la mesa e ir desde allí. –

1

Después de hurgar un poco en la fuente ScrollBar, parece que hay numerosos errores (de Windows) que se han superado en un punto u otro. Esto puede ser otro, aunque no mencionaste tu sistema operativo, ni Paul, por lo que es difícil de decir.

Todas las funciones de "cambiar la posición de la barra de desplazamiento" terminan llamando al SetScrollInfo que es un paquete privado. Sospecho que la intención es que esto actualice las cosas de la manera que desee.

Nada de eso resuelve su problema. Afortunadamente, la misma fuente también sugiere una solución:

Control deslizante.

Tendría que volver a implementar todo el comportamiento de la barra de desplazamiento dentro del control deslizante, pero una vez hecho esto, ese debería darle el control (har) que desea. Ojalá. OTOH, puede encontrarse exactamente con el mismo error de sistema operativo (si es que es un error), y volver al punto de partida.

En ESE punto, definitivamente lo registra como un error de UI de Eclipse.

PD: ¿Ha buscado el Eclipse Bugzilla para algo similar? Asomándose un poco, apareció this bug relacionado con la barra de desplazamiento no sincronizada con una vista de árbol en el navegador (en PC Linux-Motif, pero funciona bien en Windows). Sospecho que encontrarás problemas similares si cavas un poco más.

4

El método setOrigin(x,y) en ScrolledComposite debería ayudar:

Desplaza el contenido de modo que el punto especificado en el contenido se encuentra en la esquina superior izquierda. Si no se ha configurado ningún contenido, no ocurrirá nada. Los valores negativos serán ignorados. Los valores superiores a la distancia de desplazamiento máxima provocarán que se desplace hasta el final de la barra de desplazamiento.

+0

Sugerencia interesante. Echaré un vistazo. – RAY

+0

Esto funcionó para mí. Tenga en cuenta que los controles deben haberse distribuido antes de llamar a setOrigin() incluso si el contenido se ha configurado en ScrolledComposite. Si se llama al método antes del diseño, no pasará nada. –

Cuestiones relacionadas