Domanda

C'è un modo per implementare lazy loading con JList Swing?

È stato utile?

Soluzione

In un certo senso, sì. È possibile creare un personalizzato ListModel che utilizza il getElementAt(int index) metodo per caricare il valore corretto se non è già stato caricato. Vedere l'esempio nella Javadocs per 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; }
};

Altri suggerimenti

ho risolto. Avevo perso la soluzione discussa al vertice della documentazione API JList.

Nel codice sorgente di esempio che ho postato in un'altra risposta su questo argomento, aggiungere la seguente riga (e commentare) dopo aver creato il 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); 

Il problema è che JList, per impostazione predefinita, è l'accesso a tutti gli elementi in tutta la ListModel per determinare in fase di esecuzione le dimensioni di visualizzazione necessaria. La linea ha aggiunto sopra la priorità che il default, e racconta JList per esaminare solo quello valore come passato. Che un valore agisce come un modello (prototipo) per il dimensionamento la visualizzazione del JList.

See:

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

Giusto per aggiungere alla risposta di altri, quando si crea una propria implementazione di ListModel, mentre si sta caricando i dati che si desidera chiamare:

fireIntervalAdded(Object source,int index0, int index1)

Supponendo che si sta caricando i dati nella vostra lista in modo incrementale. Ciò farà sì che il JList che utilizza come modello per aggiornare.

Vedere Javadoc per fireIntervalAdded

non corretto. Quel JList sopra NON è pigramente caricato.

Altalena insiste sull'accesso a ogni voce in tutta la ListModel mentre ottenerlo visualizzato sullo schermo. Inoltre, dopo l'accesso tutti gli articoli, dell'oscillazione poi ri-accede al primo numero n di elementi visibili sullo schermo (nella vista, non fe sotto).

Esegui questo semplice classe "TestJList" per dimostrarlo. Io chiamo println ogni volta che viene eseguito 'getElementAt'. È chiaramente può vedere che swing chiama questo metodo per ogni elemento della ListModel.

Questo accade per me su un MacBook unibody con Mac OS X 10.6.2 con Java:

  

"1.6.0_17" Java (TM) SE Runtime   Ambiente (build 1.6.0_17-b04-248-10M3025)   Java HotSpot (TM) a 64 bit di server VM (costruire   14.3-b01-101, modalità mista)

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

Esegui quel codice, e vedrete:

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 -

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