Pergunta

Existe uma maneira de implementar o carregamento lento com o balanço JList?

Foi útil?

Solução

De certa forma, sim. Você pode criar um personalizado ListModel que utiliza o getElementAt(int index) método a carga o valor correto se ele já não foi carregado. Veja o exemplo nos Javadocs para JList :

// This list model has about 2^16 elements.  Enjoy scrolling.

ListModel bigData = new AbstractListModel() {
    public int getSize() { return Short.MAX_VALUE; }
    public Object getElementAt(int index) { return "Index " + index; }
};

Outras dicas

Eu resolvi isso. Eu tinha perdido a solução discutidos no topo da documentação da API JList.

No código fonte de exemplo que eu postei em outra resposta sobre este tema, adicione esta linha (e comentar) depois de criar o JList:

  // Tell JList to test rendered size using this one value rather
  // than every item in ListModel. (Much faster initialization)
  myList.setPrototypeCellValue("Index " + Short.MAX_VALUE); 

O problema é que JList, por padrão, está acessando cada item em todo o ListModel para determinar em tempo de execução o tamanho de exibição necessário. A linha adicionada acima substituições que padrão, e diz JList para examinar apenas o valor que passou. Aquele valor atua como um modelo (protótipo) para dimensionar a exibição do JList.

Veja:

http: //java.sun .com / JavaSE / 6 / docs / api / javax / swing / JList.html # prototype_example

Apenas para adicionar à outra resposta, quando você criar sua própria implementação de ListModel, enquanto você estiver carregando os dados que você vai querer chamar:

fireIntervalAdded(Object source,int index0, int index1)

Assumindo que você está carregando dados em sua lista de forma incremental. Isso fará com que o JList que está usando-o como um modelo para atualização.

Veja Javadoc para fireIntervalAdded

incorreto. Que JList acima não é preguiçosamente carregado.

Balanço insiste sobre como acessar cada item em todo o ListModel enquanto começá-lo exibido na tela. Além disso, depois de acessar todos os itens, balanço, em seguida, re-acessa o primeiro n número de itens visíveis na tela (no visor, não fora da tela abaixo).

Executar este simples classe "TestJList" para provar isso. Eu chamo println de cada vez 'getElementAt' é executado. Você pode ver claramente que as chamadas de balanço que método para cada item na ListModel.

Isso acontece para mim em um MacBook unibody executando o Mac OS X 10.6.2 com Java:

"1.6.0_17" Java (TM) SE Runtime Ambiente (construção 1.6.0_17-b04-248-10M3025) Java HotSpot (TM) 64-Bit VM Server (construção 14.3-b01-101, modo misto)

import javax.swing.*;

/**
 *  This example proves that a JList is NOT lazily-loaded.
 */
public class TestJList {
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create an artificial ListModel. 
        ListModel bigData =
            new AbstractListModel() {
                public int getSize() {
                    // return Short.MAX_VALUE;  // Try this if you have a long while to waste.
                    return 10;
                }

                public Object getElementAt(int index) {
                    System.out.println("Executing 'getElementAt' # " + index);
                    return "Index " + index;
                }
            };

        // Create a JList.
        JList myList = new JList(bigData);

        // Add the JList to the frame.
        frame.getContentPane().add(myList);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(
            new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
    }
}

Executar esse código, e você verá:

Executing 'getElementAt' # 0
Executing 'getElementAt' # 1
Executing 'getElementAt' # 2
Executing 'getElementAt' # 3
Executing 'getElementAt' # 4
Executing 'getElementAt' # 5
Executing 'getElementAt' # 6
Executing 'getElementAt' # 7
Executing 'getElementAt' # 8
Executing 'getElementAt' # 9
Executing 'getElementAt' # 0
Executing 'getElementAt' # 1
Executing 'getElementAt' # 2
Executing 'getElementAt' # 3
Executing 'getElementAt' # 4
Executing 'getElementAt' # 5
Executing 'getElementAt' # 6
Executing 'getElementAt' # 7
Executing 'getElementAt' # 8
Executing 'getElementAt' # 9

-fin -

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