2009-05-12 7 views

ответ

11

В некотором смысле, да. Вы можете создать пользовательский 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; } 
}; 
+0

спасибо за ответ, я попробовал, и это заставило меня понять, мой интерфейс был настолько медленным из-за обычая «отсортированный» список модель кто-то написал и использовал – user105413

2

Просто, чтобы добавить к другому ответу, когда вы создаете свою собственную реализацию ListModel, в то время как вы загружаете данные, которые вы хотите позвонить:

fireIntervalAdded(Object source,int index0, int index1) 

Предполагая, что вы загружаете данные в свой список поэтапно. Это вызовет использование JList в качестве модели для обновления.

См Javadoc for fireIntervalAdded

+0

Ха, интересно почему пример не сделал этого. Возможно, это больше для эстетики (удерживайте полосу прокрутки в синхронизации). –

+0

спасибо за это, я использовал его, когда я применил метод «addAll» в моей модели списка избранного – user105413

1

Неправильно. Этот 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-

5

Я решил. Я пропустил решение, обсуждаемое в верхней части документации 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

+0

Спасибо за это - это то, что я тоже пропустил. –

 Смежные вопросы

  • Нет связанных вопросов^_^