Pergunta

Como você iria sobre a exibição de enorme quantidade de linhas na tabela SWT? Enorme é algo acima de 20K linhas, 20 colunas. Não me pergunte por que eu preciso mostrar que a quantidade de dados, não é o ponto. A questão é como fazê-lo trabalhar o mais rápido possível para que o usuário final não terá espera entediado. Cada linha exibe uma instância de um objecto, as colunas são as suas propriedades (algumas). Pensei usar JFace padrão de provedor de conteúdo / label, mas com medo de que será ainda mais lento do que bater a tabela diretamente com os dados. Isto é como vai:

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

registros de desenho 20k no meu computador leva cerca de 20 segundos. O maior problema de desempenho que eu vi no Windows são causados ??por incrível quantidade de mensagens de janelas nativas enviados por SWT quando novo item tabela criada e preenchida com texto. Eu tenho encontrado grande solução para este - hide mesa antes de preencher, e depois mostrá-lo quando terminar. Apenas chamando table.setVisible (false) antes do loop e table.setVisible (true) após o loop faz maravilhas - a velocidade sobe vezes seis e sete!

Eu gostaria de acelerá-lo ainda mais. O que você sugeriria ? Além disso, eu me pergunto como este truque esconder o widget iria trabalhar em não-Windows implementações de SWT (aka Linux)?

Foi útil?

Solução

SWT pode fazer isso por você. Quando você usa a bandeira estilo SWT.VIRTUAL, os itens são criados apenas quando rolado em vista. Aqui está como fazê-lo:

  1. Criar a tabela com estilo SWT.VIRTUAL
  2. Definir a contagem de linhas usando a Tabela # setItemCount ()
  3. Adicionar um ouvinte SWT.SetData que enche os TableItems sob demanda.

Aqui está um trecho 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();
}

Outras dicas

Você quer fazer carregamento lento no visor mesa. Basicamente, você manter todos esses objetos fora da tela na memória, em seguida, criar apenas um punhado de linhas reais tabela GUI. Como o usuário rola você re-tornar estas linhas com os objetos no local de rolagem.

Consulte este artigo ( EDIT: oops eu quis dizer este artigo ) para um exemplo JFace.

1 -. Usar o setText (String []) em vez de setText (int, String) uma chamada em vez de vários

2 -. Uso myTable.setRedraw (false) antes e myTable.setRedraw (true) após o processo de parar todas as operações redesenhar durante o carregamento de dados

É mais simples e pode melhorar o desempenho !!

boa sorte.

do meu lado usando este I carga de 2500 linhas de 20 coluna em menos de 300ms ..... em um PC hoje padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top