功能很简单,点击按钮加入jlist一行,不过加入以后,我发现arraylist确实增大了,不过jlist变成了一片空白,不知道为什么,我看很多东西写的都是这样做的。
public class TryJlist extends JFrame{ /**
 * @param args
 */
public ArrayList<String> list;
public JList jlist;
public TryJlist() {
list = new ArrayList<String>();
list.add("item1");
list.add("item2");
list.add("itme3");
   jlist = new JList(new MyModel());
   JScrollPane panel = new JScrollPane(jlist);
   JButton button = new JButton("change");
   button.addActionListener(new ActionListener() {
  @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
list.add("additem");
System.out.println(list.size());
jlist.repaint();

   });
add(panel, BorderLayout.CENTER);
add(button, BorderLayout.NORTH);
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
              new TryJlist();
}
   class MyModel extends DefaultListModel {

   @Override
  
   public Object getElementAt(int index) {
// TODO Auto-generated method stub

  return list.get(index); 
//return super.getElementAt(index);
}
   
@Override
public int getSize() {
// TODO Auto-generated method stub
System.out.println(list.size());
return list.size();
//return super.getSize();
}
   }
}

解决方案 »

  1.   

    觉得你这个写法其实不太好,但我按照你的写法改了下import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JScrollPane;public class TryJlist extends JFrame {
    public ArrayList<String> list;
    public JList jlist; public TryJlist() {
    list = new ArrayList<String>();
    list.add("item1");
    list.add("item2");
    list.add("itme3");
    jlist = new JList(new MyModel());
    JScrollPane panel = new JScrollPane(jlist);
    JButton button = new JButton("change");
    button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    list.add("additem");
    System.out.println(list.size());
    jlist.setModel(new MyModel());
    //jlist.repaint();
    }
    });
    add(panel, BorderLayout.CENTER);
    add(button, BorderLayout.NORTH);
    setSize(400, 300);
    setVisible(true);
    } public static void main(String[] args) {
    new TryJlist();
    }
    class MyModel extends DefaultListModel { public Object getElementAt(int index) {
    // TODO Auto-generated method stub return list.get(index);
    // return super.getElementAt(index);
    } public int getSize() {
    // TODO Auto-generated method stub
    System.out.println(list.size());
    return list.size();
    // return super.getSize();
    }
    }
    }
      

  2.   

    谢谢回复,我想知道为什么不能使用同一个model呢?model内的数据改变后有什么机制可以迫使JList重新更新model的值呢,谢谢!如果我没操作一次就申请一个model的话我想把数据存贮在model中的话岂不是无法实现了?望赐教
      

  3.   

    刚才研究了一下源代码,发现如果要在自己的model里边实现数据的更新,如添加和插入操作,必需在末尾处调用
    fireIntervalAdded(obj, vector.size(), vector.size()); 这个方法才可以,否则是不会更新的,而删除则需要调用fireIntervalRemoved(Object source, int index0, int index1)才可以。感觉如果不是看源代码的话自己实现起来还是比较麻烦的。
      

  4.   

    其实jlist.setModel(new MyModel());就会调用fire方法了o(∩_∩)o...,多看源代码比来csdn问好多了
      

  5.   

    你model里边的list是TryJlist类里面的成员变量,无论new多少个model这个数据都在成员变量里面,我这里new一个就是为了出发这个fireXXX方法而已
      

  6.   

    你单独拿个对象来表示model不就可以了?
    MyModel  mm = new MyModel();
    每次更新的时候mm.add()就OK了。