Frage

Wie würden Sie gehen über die riesige Menge an Zeilen in SWT Tabelle angezeigt wird? Huge ist etwas oberhalb 20K Zeilen, 20 Spalten. Frag mich nicht, warum ich, dass viele Daten zeigen müssen, es ist nicht der Punkt. Der Punkt ist, wie man es so schnell wie möglich machen arbeiten, so dass Anwender nicht langweilig Warte bekommen. In jeder Zeile wird eine Instanz eines Objekts, Spalten sind seine Eigenschaften (einige). Ich dachte, JFace Inhalt / label-Anbieter Muster zu verwenden, aber Angst, es wird sogar langsamer als die Tabelle direkt mit den Daten zu treffen. Dies ist, wie es geht:

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

Zeichnung 20k Aufzeichnungen auf meinem Computer dauert etwa 20 Sekunden. Das größte Leistung Problem, das ich in Windows gesehen habe durch unglaubliche Menge an nativen Windowing-Nachrichten von SWT gesendet verursacht wird, wenn neuer Tabelleneintrag erstellt und mit Text gefüllt. vor bevöl verbergen Tisch, und dann zeigen, wenn Sie fertig sind - ich habe große Abhilfe für dieses gefunden. Nur table.setVisible (false) vor der Schleife und table.setVisible (true) nach der Schleife Aufruf wirkt Wunder - die Geschwindigkeit steigt sechs bis sieben Mal!

Ich mag es noch beschleunigen. Was würdest du vorschlagen ? Außerdem frage ich mich, wie dieser Trick, um das Widget versteckt auf Nicht-Windows-Implementierungen von SWT funktionieren würde (aka Linux)?

War es hilfreich?

Lösung

SWT für Sie tun. Wenn Sie die SWT.VIRTUAL Stil Flag verwenden, werden die Elemente nur erstellt, wenn auf den Bildschirm gescrollt. Hier ist, wie es zu tun:

  1. Erstellen Sie die Tabelle mit Stil SWT.VIRTUAL
  2. Stellen Sie die Zeilenanzahl unter Verwendung von Tabelle # setItemCount ()
  3. Fügen Sie einen SWT.SetData Listener, der die TableItems auf Nachfrage füllt.

Hier ist ein Code-Snippet:

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

Andere Tipps

Sie wollen auf dem Tisch Display faul-Laden zu tun. Grundsätzlich halten Sie all diese Objekte außerhalb des Bildschirms im Speicher, dann nur eine Handvoll von Tabellenzeilen tatsächlicher GUI erstellen. Wenn der Benutzer scrollt Sie neu rendern diese Zeilen mit den Objekten in dieser Scroll-Position.

Siehe diesem Artikel ( EDIT: oops ich meinte diesem Artikel ) für ein JFace Beispiel.

. 1 - Verwenden Sie die setText (String []) statt setText (int, String) ein Aufruf anstelle von mehreren

. 2 - Verwendung myTable.setRedraw (false) vor und myTable.setRedraw (true) nach dem Prozess alle neu gezeichnet opérations beim Laden von Daten zu stoppen

es ist einfacher und kann die Leistung verbessern !!

viel Glück.

auf meiner Seite mit dieser I Last 2500 Zeilen 20-Säule in weniger als 300 ms ..... auf einem Standard-PC heute.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top