Pregunta

¿Cómo harías para mostrar una gran cantidad de filas en la tabla SWT?Enorme es algo por encima de 20.000 filas, 20 columnas.No me pregunten por qué necesito mostrar tantos datos, ese no es el punto.La cuestión es cómo hacer que funcione lo más rápido posible para que el usuario final no se aburra esperando.Cada fila muestra una instancia de algún objeto, las columnas son sus propiedades (algunas).Pensé en usar el patrón de proveedor de etiquetas/contenido de JFace, pero temo que sea incluso más lento que golpear la mesa directamente con los datos.Así es como va:

    Display.getDefault().asyncExec(new Runnable() {
       public void run() {
           List<MyObject> objects = model.getViewData();
           for(MyObject object: objects){
           TableItem item = new TableItem(table, SWT.NULL);
           item.setImage(0, img1);
           item.setBackground(color1);
               item.setText(0, object.getProperty0());
               item.setText(1, object.getProperty1());
               item.setText(2, object.getProperty2());
               ..... 
            }
       });

Dibujar 20.000 registros en mi computadora lleva unos 20 segundos.El mayor problema de rendimiento que he visto en Windows se debe a la increíble cantidad de mensajes de ventanas nativos enviados por SWT cuando se crea un nuevo elemento de tabla y se completa con texto.Encontré una excelente solución para esto: ocultar la tabla antes de completarla y luego mostrarla cuando haya terminado.Simplemente llamar a table.setVisible(false) antes del ciclo y table.setVisible(true) después del ciclo hace maravillas: ¡la velocidad aumenta de seis a siete veces!

Me gustaría acelerarlo aún más.Qué sugieres ?Además, me pregunto cómo funcionaría este truco para ocultar el widget en implementaciones de SWT que no sean de Windows (también conocido como Linux).

¿Fue útil?

Solución

SWT puede hacer eso por usted. Cuando se utiliza la bandera de estilo SWT.VIRTUAL, elementos sólo se crean cuando desplazado a la vista. He aquí cómo hacerlo:

  1. Crea la mesa con estilo SWT.VIRTUAL
  2. Establecer el número de filas usando la Tabla # setItemCount ()
  3. Añada un receptor SWT.SetData que llena los TableItems bajo demanda.

He aquí un fragmento de código:

public static void main( String[] args ) {
    Display display = new Display();
    Shell shell = new Shell( display );
    shell.setLayout( new FillLayout() );
    final Table table = new Table( shell, SWT.VIRTUAL );
    table.setItemCount( 10000 );
    table.addListener( SWT.SetData, new Listener() {
        public void handleEvent( Event event ) {
            TableItem item = (TableItem)event.item;
            item.setText( "Item " + table.indexOf( item ) );
        }
    } );
    shell.setSize( 300, 500 );
    shell.open();
    while( !shell.isDisposed() ) {
        if( !display.readAndDispatch() ) {
            display.sleep();
        }
    }
    display.dispose();
}

Otros consejos

¿Quieres hacer perezoso de carga en la presentación de las tablas. Básicamente, a mantener todos estos objetos fuera de la pantalla en la memoria, a continuación, crear sólo un puñado de filas de tabla reales interfaz gráfica de usuario. A medida que el usuario se desplaza que volver a hacer estas filas con los objetos en ese lugar de desplazamiento.

este artículo ( EDIT: ¡Uy me refería este artículo ) para un ejemplo JFace.

1 -. Utilizar el setText (String []) en lugar de setText (int, String) una llamada en lugar de varios

2 - utilizar myTable.setRedraw (falso) antes y myTable.setRedraw (true) después de que el proceso para detener todas las operaciones vuelve a dibujar durante la carga de datos

.

es más sencillo y se puede mejorar el rendimiento !!

buena suerte.

de mi lado el uso de esta carga de E 2500 líneas de la columna 20 en menos de 300 ms ..... hoy en un PC estándar.

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