如果有大量数据要在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);
}
}