Java: JList显示几百万条数据的速度

Java: JList显示几百万条数据的速度
如果有大量数据要在JList中显示,如几十万条,直接使用new JList(dataModel),然后显示这个JList,速度是非常慢的,让人难以忍受。因为这时,JList显示之前,要先访问dataModel中的所有数据,用这些数据来计算出JList中cell的高度与宽度,进而计算出JList的高度与宽度,这是一个非常耗时的动作。
如果在JList显示之前,先设置JList原型的值setPrototypeCellValue(Object prototypeCellValue)或者事先设置好setFixedCellWidth(int fixedCellWidth), setFixedCellHeight(int fixedCellHeight),那么JList显示之前,就不会去访问所有要显示的数据来设计它的高度与宽度了,这样就节省了很多时间与资源,当JList要显示某些数据项时,就只会去调用ListModel.getElementAt(int index)去取得这个数据项,其它的数据项并不影响JList的显示速度。

import java.io.IOException;


import javax.swing.AbstractListModel;

import javax.swing.JFrame;

import javax.swing.JList;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.event.ListSelectionEvent;

import javax.swing.event.ListSelectionListener;


public class Test1 {

    public static void main(String[] args) throws IOException {

        MyFrame frame = new MyFrame();

        frame.setSize(400, 400);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);


        // int size = 10000000;

        // for (int i = 0; i < size; ++i) {

        // String str = "" + i;

        // }

    }

}


class MyFrame extends JFrame {

    private JList list;


    public MyFrame() {

        list = new JList(new AbstractListModel() {

            private int length = 30000000;


            public Object getElementAt(int index) {

                System.out.println("ListModel.getElementAt(): " + index);

                return "" + index;

            }


            public int getSize() {

                // System.out.println("ListModel.getSize()");

                return length;

            }

        });

        list.setVisibleRowCount(4);

        // list.setFixedCellWidth(50);

        // list.setFixedCellHeight(15);

        list.setPrototypeCellValue("www");

        list.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {

            }

        });


        JScrollPane scroller = new JScrollPane(list);

        JPanel panel = new JPanel();

        panel.add(scroller);

        getContentPane().add(panel);


    }

}


你可能感兴趣的:(Java: JList显示几百万条数据的速度)