Есть ли способ реализовать ленивую загрузку с помощью JList Swing?Есть ли ленивая реализация загрузки JList?
ответ
В некотором смысле, да. Вы можете создать пользовательский ListModel
, который использует метод getElementAt(int index)
для загрузки правильного значения, если он еще не был загружен. Смотрите пример в Javadocs для 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; }
};
Просто, чтобы добавить к другому ответу, когда вы создаете свою собственную реализацию ListModel
, в то время как вы загружаете данные, которые вы хотите позвонить:
fireIntervalAdded(Object source,int index0, int index1)
Предполагая, что вы загружаете данные в свой список поэтапно. Это вызовет использование JList
в качестве модели для обновления.
Ха, интересно почему пример не сделал этого. Возможно, это больше для эстетики (удерживайте полосу прокрутки в синхронизации). –
спасибо за это, я использовал его, когда я применил метод «addAll» в моей модели списка избранного – user105413
Неправильно. Этот JList выше НЕ лениво загружен.
Swing настаивает на доступе к каждому элементу во всей ListModel, пока он отображается на экране. Кроме того, после доступа ко всем элементам Swing затем повторно обращается к первому n количеству элементов, видимых на экране (в окне просмотра, а не на экране ниже).
Запустите этот простой класс «TestJList», чтобы это доказать. Я вызываю println каждый раз, когда выполняется «getElementAt». Вы можете просто увидеть, что Swing вызывает этот метод для каждого элемента в ListModel.
Это происходит для меня на цельным MacBook работает Mac OS X 10.6.2 с Java:
"1.6.0_17" Java (TM) SE среды выполнения среды (строительство 1.6.0_17-b04-248 -10M3025) Java HotSpot (TM) 64-разрядный сервер VM (сборка 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-
Я решил. Я пропустил решение, обсуждаемое в верхней части документации API JList.
В примере исходного кода я писал в другой ответ на эту тему, добавьте эту строку (и комментарий) после создания 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);
Проблема заключается в том, что JList, по умолчанию, который обращается каждый пункт во всем ListModel, чтобы определить во время выполнения необходимый размер отображения. Строка, добавленная выше, переопределяет это значение по умолчанию и сообщает JList рассматривать только одно значение, переданное. Это одно значение действует как шаблон (прототип) для определения отображения JList.
См:
http://java.sun.com/javase/6/docs/api/javax/swing/JList.html#prototype_example
Спасибо за это - это то, что я тоже пропустил. –
спасибо за ответ, я попробовал, и это заставило меня понять, мой интерфейс был настолько медленным из-за обычая «отсортированный» список модель кто-то написал и использовал – user105413