Domanda

Come si va sulla visualizzazione di enormi quantità di righe nella tabella SWT? Enorme è qualcosa al di sopra 20K righe, 20 colonne. Non chiedetemi perché ho bisogno di dimostrare che molti dati, non è questo il punto. Il punto è come fare funzionare il più velocemente possibile in modo che l'utente finale non otterrà attesa annoiato. Ogni riga mostra un esempio di un oggetto, le colonne sono le sue proprietà (alcune). Ho pensato di usare JFace contenuti / etichetta modello fornitore, ma ha paura che sarà ancora più lento di colpire il tavolo direttamente con i dati. Questo è come 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());
               ..... 
            }
       });

record Disegno 20k sul mio computer è di circa 20 sec. Il più grande problema di prestazioni che ho visto in Windows sono causati da incredibili quantità di messaggi di finestre nativo inviati da SWT quando nuovo elemento tabella creata e popolata con il testo. Ho trovato grande soluzione per questo - nascondere tavolo prima di popolamento, e poi mostrare che quando fatto. Basta chiamare table.setVisible (false) prima del ciclo e table.setVisible (vero) dopo il ciclo fa miracoli - la velocità sale a sei-sette volte!

mi piacerebbe accelerarlo ancora di più. Che cosa suggeriresti ? Inoltre, mi chiedo come questo trucco si nasconde il widget dovrebbe funzionare su implementazioni non Windows di SWT (aka Linux)?

È stato utile?

Soluzione

SWT può farlo per voi. Quando si utilizza il flag stile SWT.VIRTUAL, gli elementi vengono creati solo quando scorre in vista. Ecco come fare:

  1. Crea la tavola con stile SWT.VIRTUAL
  2. Imposta il conteggio delle righe utilizzando la tabella # setItemCount ()
  3. Aggiungi un ascoltatore SWT.SetData che riempie le TableItems su richiesta.

Ecco un frammento di codice:

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();
}

Altri suggerimenti

Si vuole fare lazy-caricamento sul display tavolo. In pratica, di mantenere tutti questi oggetti fuori dallo schermo in memoria, quindi creare solo una manciata di righe della tabella effettivi GUI. Come l'utente scorre si ri-renderizzare queste righe con gli oggetti in quella posizione di scorrimento.

questo articolo ( EDIT: oops volevo dire questo articolo ) per un esempio di JFace.

1 -. Utilizzare il setText (String []) invece di setText (int, String) una chiamata invece di più

2 - utilizzare myTable.setRedraw (false) prima e myTable.setRedraw (vero) dopo il processo di fermare tutte le operazioni e lo ridisegna durante il caricamento dei dati

.

è più semplice e può migliorare le prestazioni !!

buona fortuna.

dalla mia parte utilizza questo carico di I 2500 righe di 20 colonne in meno di 300ms ..... su un PC standard oggi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top