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