该程序运行时getElementAt会执行两次。但是程序中并没有调用该函数阿!哪位能告诉我是什么原理阿?我在JDK上也找不到说明。程序是在执行到哪里的时候才会自动调用getElementAt函数。
import java.awt.*;
import javax.swing.event.*;
import javax.swing.*;
import java.util.ArrayList;private FilterField filterField;
private int DEFAULT_FIELD_WIDTH = 20;public FilteredJList() {
super();setModel (new FilterModel());
filterField = new FilterField (DEFAULT_FIELD_WIDTH);
}public void setModel (ListModel m) {
if (! (m instanceof FilterModel))
throw new IllegalArgumentException();
super.setModel (m);}public void addItem (Object o) {
((FilterModel)getModel()).addElement (o);}public JTextField getFilterField() {
return filterField; //get JTextField object
}// test filter list
public static void main (String[] args) {
String[] listItems = {
"Chris", "Joshua", "Daniel", "Michael",
"Don", "Kimi", "Kelly", "Keagan"
};
JFrame frame = new JFrame ("FilteredJList");
frame.getContentPane().setLayout (new BorderLayout());
// populate list
FilteredJList list = new FilteredJList();
for (int i=0; i<listItems.length; i++) {list.addItem (listItems[i]);
}
JScrollPane pane =
new JScrollPane (list,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
frame.getContentPane().add (pane, BorderLayout.CENTER);
frame.getContentPane().add (list.getFilterField(),
BorderLayout.NORTH);System.out.println("result1");
frame.pack();
frame.setVisible(true);
System.out.println("result2");
}
class FilterModel extends AbstractListModel {
ArrayList<Object> items;
ArrayList<Object> filterItems;
public FilterModel() {
super();
items = new ArrayList<Object>();
filterItems = new ArrayList<Object>();
}public Object getElementAt (int index) System.out.println("getElementAt:");
if (index < filterItems.size()){return filterItems.get (index);}
else
return null;
}
public int getSize() {
return filterItems.size();//ArrayList
}
public void addElement (Object o) {
System.out.println("addElement");
items.add (o);
refilter();
}
private void refilter() {
filterItems.clear(); 
String term = getFilterField().getText();
for (int i=0; i<items.size(); i++)
if (items.get(i).toString().indexOf(term, 0) != -1)filterItems.add (items.get(i));
fireContentsChanged (this, 0, getSize());}class FilterField extends JTextField implements DocumentListener {
public FilterField (int width) {
super(width);
getDocument().addDocumentListener (this);}public void changedUpdate (DocumentEvent e) {
((FilterModel)getModel()).refilter(); }public void insertUpdate (DocumentEvent e) {((FilterModel)getModel()).refilter(); }public void removeUpdate (DocumentEvent e) {((FilterModel)getModel()).refilter(); }
}
}

解决方案 »

  1.   

    应该是在调用JList中调用了这个方法,你参看一下下面的帖子
    http://www.popbb.net/soft/t113/200710547.shtml
      

  2.   

    哪里有相关的说明阿,我找了半天都找不到,getElementAt 在程序中调用了两次,但就是不知道这个函数到底是在什么时候会调用。
      

  3.   

    从list继承的get方法最终都会调用吧,去看看jdk源代码吧
      

  4.   

    我找过了,get中好象没有调用到getElementAt,但是我发现调用getElementAt和filterItems.add (items.get(i))这句有关,只要有filterItems.add 就会调用getElementAt。但我还是搞不懂是为什么?高手解答阿~~