[Java/SWT] table(viewer) voor grote tabellen

Pagina: 1
Acties:

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Hallo,

De standaard Table widget en de TableViewer JFace viewer zijn er niet op gemaakt om veel records weer te geven. Dit vanwege het feit dat alle records al als objecten in de tabel widget gezet worden. Zo duurt het met 100.000 records minuten (danwel uren) voordat alles op het scherm staat.

Ik vond in de eclipse newsgroups het volgende:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package org.eclipse.swt.widgets;

import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.win32.LRESULT;
import org.eclipse.swt.internal.win32.LVITEM;
import org.eclipse.swt.internal.win32.NMHDR;
import org.eclipse.swt.internal.win32.NMLISTVIEW;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.TCHAR;

/**
 * @author Administrator
 * 
 */
public class LargeTable extends Table {

    private ITableLabelProvider m_LabelProvider;
    public LargeTable(Composite parent, int style) {
        super(parent, checkStyle(style));
    }
    public void setLabelProvider(ITableLabelProvider labelProvider) {
        m_LabelProvider = labelProvider;
    }
    
    int widgetStyle() {
        int bits = super.widgetStyle();
        //bits |= 0x1000;
        return bits;
    }
    
    // When it overrides the super function, we don't see records
    void createItem2(TableItem item, int index) {
    }
    
    public void createItems(int cnt) {
        items = new TableItem[cnt];
        for (int i = 0; i < cnt; i++) {
            LVITEM lvItem = new LVITEM();
            lvItem.iItem = i;
            lvItem.iImage = OS.I_IMAGENONE;
            lvItem.mask = OS.LVIF_IMAGE;
            //
            items[i] = new TableItem(this, SWT.NONE);
        }
        //
        OS.SendMessage(handle, 0x1000 + 47, cnt, 0);
    }
    
    LRESULT wmNotifyChild(int wParam, int lParam) {
        NMHDR hdr = new NMHDR();
        OS.MoveMemory(hdr, lParam, NMHDR.sizeof);
        switch (hdr.code) {
            case 0xFFFFFF4F :
                {
                    //System.out.println
                    NMLISTVIEW pnmlv = new NMLISTVIEW();
                    OS.MoveMemory(pnmlv, lParam, NMLISTVIEW.sizeof);
                    //
                    int item = pnmlv.iSubItem;
                    int subItem = pnmlv.uNewState;
                    /*if ((pnmlv.iItem & OS.LVIF_IMAGE) != 0) {
                        if ((m_LabelProvider != null) && (subItem == 0)) {
                            Image image = m_LabelProvider.getColumnImage(new Integer(item),
subItem);
                            pnmlv.lParam = imageIndex(image);
                            OS.MoveMemory(lParam, pnmlv, NMLISTVIEW.sizeof);
                        }
                    }*/
                    if ((pnmlv.iItem & OS.LVIF_TEXT) != 0) {
                        String string;
                        if (m_LabelProvider != null)
                            string = m_LabelProvider.getColumnText(new Integer(item), subItem);
                        else
                            string = "";
                        TCHAR buffer = new TCHAR(getCodePage(), string, true);
                        int byteCount = buffer.length() * TCHAR.sizeof;
                        OS.MoveMemory(pnmlv.x, buffer, byteCount);
                    }
                }
        } // switch
        return super.wmNotifyChild(wParam, lParam);
    }
}

maar deze code werkt op Eclipse 2.0.1 niet helemaal goed. Iemand die hier wat licht op kan schijnen?

Verwijderd

Ehh, kan je denk ik niet helpen, maar 't is misschien handig als je wat info geeft over wat er dan precies "niet helemaal goed" werkt.

edit: De code, en dan met name klassenamen, lijkt echt verschrikkelijk veel op de 'normale' C++ code, het moet dus niet al te moeilijk zijn C++ code die dit wel goed doet te converteren naar Java. Met andere woorden: zoek eens bij codeproject of codeguru.

[ Voor 52% gewijzigd door Verwijderd op 10-02-2003 09:44 ]


  • B-Man
  • Registratie: Februari 2000
  • Niet online
hondass50: als de code exact zo gebruik als ik hem vond, worden er geen records getoond. Daarnaast is het zo dat alle records reeds uit de database gehaald worden, en niet on-demand.

Nog niet aan C++ sites gedacht, goed idee!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
OK, ben inmiddels wat wijzer geworden na een bezoekje aan MSDN + codeguru.

De
Java:
1
OS.SendMessage(handle, 0x1000 + 47, cnt, 0);

code stuur een LVM_SETITEMCOUNT voor een virtual table.

De hex code in widgetStyle() heeft te maken met LVS_OWNERDATA, alleen ben ik er nog niet uit wat dit nu exact doet, (het |=, is een bitwise OR?).

Het switch statement in wmNotifyChild() vangt alleen de redraw event voor zichtbare cellen af.

Morgen maar weer wat aan het testen, heb nu in ieder geval een aantal volledige C++ voorbeelden om ernaast te leggen.

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Zo, heb het nu aan de gang. Het bleek uiteindelijk vrij simpel op te lossen door simpelweg het gehele JFace framework te omzeilen, en deze nieuwe LargeTable widget zelf direct van content te voorzien.

hondass: nogmaals bedankt, zonder je tip (kijk eens naar C++) was het me niet zo snel gelukt denk ik!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Begint SWT nou een beetje van de grond te komen? Op javalobby zie ik ook bij tig gesprekken dat mensen refereren naar SWT als een vervangers voor Swing (en Swing sucks bigtime imo), maar ik zie nog geen SWT producten verschijnen.

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Alarmnummer: ik denk dat de massa niet zo'n zin heeft om Swing te verlaten, aangezien SWT nogal een Work-In-Progress is. Ik lees overigens wel in verschillende nieuwsgroepen dat er absoluut animo is voor SWT. Maar ik denk dat, zolang er nog geen GUI-builder is, ontwikkelaars het wel zullen bekijken, maar mogelijk nog niet inzetten.

Er lopen daarnaast overigens al een aantal nieuwe SWT projecten: zo zal er binnen niet al te lange tijd een GUI builder zijn (prog is wel commercieel gelicensed: http://www.swtworkbench.com/index.shtml, maar het GUI-builder-framework waar het op gebouwd is, is open source gemaakt).

Ik ben zelf wel fan aan het worden voorzover ik het nog niet was, aangezien je met Java/SWT nu ook native apps kunt maken die bijvoorbeeld RMI ondersteunen. Ik vind java vergeleken met C/C++ gewoon een stuk lekkerder proggen, en m.b.v. SWT/JFace kan ik nu leuke clientside apps maken.

Zoals je in dit topic overigens ook hebt kunnen lezen, heb ik zojuist een Virtual Table gemaakt m.b.v. SWT, wat nodig was/is voor een van mijn apps.

Verwijderd

B-Man schreef op 12 februari 2003 @ 23:55:
hondass: nogmaals bedankt, zonder je tip (kijk eens naar C++) was het me niet zo snel gelukt denk ik!
Graag gedaan hoor! :)
B-Man schreef op 13 februari 2003 @ 21:21:
Alarmnummer: ik denk dat de massa niet zo'n zin heeft om Swing te verlaten, aangezien SWT nogal een Work-In-Progress is. Ik lees overigens wel in verschillende nieuwsgroepen dat er absoluut animo is voor SWT. Maar ik denk dat, zolang er nog geen GUI-builder is, ontwikkelaars het wel zullen bekijken, maar mogelijk nog niet inzetten.
Ik denk eigenlijk dat een GUI builder niet zo'n probleem is, ik bedoel, voor awt en swing doen volgens mij ook 9 vd 10 mensen alles 'met de hand'. Ook als je bijv de VS.NET winforms designer ziet, vindt ik dat nou ook niet echt top werken, kortom, zo'n achterstand heeft SWT eigenlijk ook weer niet.

Ik denk eerder dat het probleem is dat er teveel alternatieven gaan ontstaan: leer je eerst AWT, heb je je er eindelijk toe gezet je in Swing te gaan verdiepen, en dan komt er nu weer iets nieuws... Tja, dat houd een keer op.

  • B-Man
  • Registratie: Februari 2000
  • Niet online
hondass: ik denk dat dat juist meevalt. Er is namelijk sinds kort de mogelijkheid tot het gebruik van AWT bovenop SWT.

Daarnaast vind ik drie mogelijkheden eigenlijk relatief weinig.

Interessant zijn overigens de ontwikkelingen rondom het gebruik van zowel swing als SWT; Het beste van twee werelden.

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
kun je SWT eigenlijk gebruiken met Webstart? Ben een CMS admin-applicatie in elkaar aan het steken en Swing is tamelijk traag (op m'n 400Mhz PII). Maar aangezien ik een WYSIWYG html editor moest hebben en die blijkbaar niet in SWT bestond hebben we besloten om bij Swing te blijven. Maar door bovengaande comments (SWT+Swing) is er misschien a way round?. Om te porten tussen beide is het geen probleem aangezien de hele interface via een XUL in elkaar steekt... Wel moet ik zeggen dat zoals B-Man post zie je eigenlijk gewoon aan het windows proggen bent en je dan ineens kunt C++/C# ook :) (of Delphi?)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je volledige rechten aanvraagt zal er denk ik geen probleem zijn. SWT gebruikt natuurlijk aardig wat native code en die mag je normaal gesproken niet zomaar draaien in een sandbox.

Het zou wel goed zijn als SWT/JFace eens een beetje los van Eclipse gepromoot werd. Een simpele SDK met API docs, de benodigde libraries en wat samples zou het wellicht een stuk aantrekkelijker en overzichtelijker maken. Ik heb al eens een Ant build file gemaakt die alle benodigde stuff uit CVS haalt, maar er moet veel meer gebeuren om een leuke SDK op te zetten...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1