Неправильно. Этот JList выше НЕ загружен лениво.
Swing настаивает на доступе к каждому элементу во всей ListModel при отображении его на экране. Кроме того, после доступа ко всем элементам Swing затем повторно обращается к первому n количеству элементов, видимых на экране (в окне просмотра, а не за пределами экрана ниже).
Запустите этот простой класс "TestJList", чтобы доказать это. Я вызываю println каждый раз, когда выполняется getElementAt. Вы можете ясно видеть, что Swing вызывает этот метод для каждого элемента в ListModel.
Это происходит для меня на MacBook Unibody под управлением Mac OS X 10.6.2 с Java:
"1.6.0_17" Java (TM) SE Runtime
Окружающая среда (сборка 1.6.0_17-b04-248-10M3025)
Java HotSpot (TM) 64-битная серверная виртуальная машина (сборка
14,3-b01-101, смешанный режим)
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();
}
});
}
}
Запустите этот код, и вы увидите:
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-