有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (4) 个答案

  1. # 1 楼答案

    为了补充另一个答案,当您创建自己的ListModel实现时,您正在加载要调用的数据:

    fireIntervalAdded(Object source,int index0, int index1)
    

    假设您正在以增量方式将数据加载到列表中。这将导致将其用作模型的JList更新

    Javadoc for fireIntervalAdded

  2. # 2 楼答案

    我解决了。我错过了JList API文档顶部讨论的解决方案

    在我在本主题的另一个答案中发布的示例源代码中,在创建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

  3. # 3 楼答案

    在某种程度上,是的。您可以创建一个自定义^{},如果尚未加载,它将使用^{}方法加载正确的值。参见Javadocs中的^{}示例:

    // 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; }
    };
    
  4. # 4 楼答案

    不对。上面的JList并没有延迟加载

    Swing坚持访问整个ListModel中的每个项目,同时将其显示在屏幕上。此外,在访问所有项目后,Swing然后重新访问屏幕上可见的前n个项目(在视口中,而不是下面的屏幕外)

    运行这个简单的“TestJList”类来证明它。每次执行“getElementAt”时,我都会调用println。您可以清楚地看到,Swing对ListModel中的每个项都调用了该方法

    这在运行Mac OS X 10.6.2和Java的MacBook unibody上发生:

    "1.6.0_17" Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025) Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)

    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
    

    -鳍-