疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java基础JList动态添加元素


 

 
学Java时用到了JList不知怎么添加元素,这里说说我的经验:
 
  Jlist显示对象列表并且允许用户选择一个或多个项的组件。单独的模型 ListModel 维护列表的内容。
 
  这里要注意在把Jlist添加到容器时可以选择用JScrollPane(提供轻量级组件的 scrollable 视图。JScrollPane 管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口。)
 
 例如:JPanel jp = new JPanel();
 
      JScrollPane jsp = new JScrollPane();
 
     JList jl = new JList();
 
      jsp.add(jl);
 
      jp.add(jsp);
 
   这里只是个例子:为了说明JList 对象不能直接添加到JPanel中,而是要添加到JScrollPane中,之后再把JScrollPane 对象添加到JPanel中。这里没有加有关布局管理器的代码,读者可以根据这个思想自行添加。(这只是我的经验,如有更好的方法还请补充)。
 
   再说说如何动态的添加元素到JList中:
 
  先举例说明静态的添加元素:
 
   String[] data = {"one", "two", "three", "four"};
    JList myList = new JList(data);
   
 
   Vector superClasses = new Vector();
    Class rootClass = javax.swing.JList.class;
    for(Class cls = rootClass; cls != null; cls = cls.getSuperclass()) {
        superClasses.addElement(cls);
    }
    JList myList = new JList(superClasses);
 
 
 
   ListModel model = myList.getModel();
    for(int i = 0; i < model.getSize(); i++) {
         System.out.println(model.getElementAt(i));
    }
    这三种都是jdk文档里的例子,都是在创建JList的时候静态的添加元素,添加后不能修改,删除,增加。
 
   如果要动态的添加,以下是我的经验:
 
   按我的理解,其实JList不管数据的添加,而是由DefaultListModel类实现数据的添加,先说说这个类的继承关系。
 
   ListMode(接口)<----AbstractListMode类<------DefaultListModel类
    例如:
 
   DefaultListModel dlm = new DefaultListModel();
 
   dlm.addElement(element1);
 
    dlm.addElement(element2);
 
   .....
 
   JList jl = new JList();
 
   jl.setModel(dlm);
 
    这样就把元素都添加进去了。
 
同理:要删除全部信息
 
   dlm.clear();
 
   jl.setModel(dlm);
 
即可。
 
移除此列表中指定位置处的元素
 
则:
 
   dlm.remove(int index);
 
   jl.setModel(dlm);
 
 
 
总之,就是JList不管元素的添加,而是由DefaultListMode管,最后设置Jlist.setMode(DefaultListMode)就完成了元素的动态添加。想了解更多有关Jlist的知识请查询Jdk帮助文档。
 
=====================
 
 
 
List:
显示对象列表并且允许用户选择一个或多个项的组件。
 
JList的构造方法:
 
1.根据数组创建列表:
 
JList(Object[] listData) 
构造一个 JList,使其显示指定数组中的元素。
 
 String[] str = { "列表1", "列表2", "列表3", "列表4" };
 JList<String> s = new JList<>(str);
一个简单地列表就显示出来了。
 
2.根据指定的非 null 模型构造一个显示元素的 JList。
 
JList(ListModel dataModel) 
 
DefaultListModel<String> model=new DefaultListModel<>();
model.addElement("列表1");
model.addElement("列表2");
model.addElement("列表3");
model.addElement("列表4");
JList<String> s = new JList<>(model);
 
 
一个图片的JList 
 
 ImageIcon u = new ImageIcon(this.getClass().getResource("卡通.jpg"));
u.setImage( u.getImage().getScaledInstance(50, 50,  Image.SCALE_DEFAULT));
DefaultListModel<ImageIcon> model=new DefaultListModel<>();
model.addElement(u);
model.addElement(u);
model.addElement(u);
model.addElement(u);
JList<ImageIcon> list = new JList<>(model);
 
 
怎么实现一个又有图片又有文字的JList呢? 
 
首先认识一下,JList的几个重要部分:
 
1.ListModel列表模型,用于获取列表中每个单元格的值以及列表的长度,
 
我们可以通过继承AbstractListModel类,来写自己的JList列表;AbstractListModel类继承了实现了ListModel接口,并且实现了序列化,
 
2.ListCellRenderer :单元渲染器。
 
要想使列表添加图片,那么我们就需要去自己实现这个ListCellRenderer 这个接口;
 
在默认的单元渲染器中,返回的是一个JLable,也就是把一个JLable放入JList中的列表中,作为它的每一个项目;
 
从JList默认的单元渲染器中我们可以看出JAVA自带的JList不能够同时实现文字以及图片。所以如果要实现一个既有文字又有图片的JList的话,那我们就需要去自己实现单元渲染器;
 
自定义JLIst列表
1.自定义ListModel列表模型:
 
public class FriListModel extends  AbstractListModel {
ArrayList<User> uArray;//好友类表;
        
public FriListModel(ArrayList<User> uArray){
this.uArray=uArray;
}
@Override
public int getSize() {  
return uArray.size();
}
@Override
public Object getElementAt(int index) {
return   uArray.get(index) ;
}
}
2.自定义单元渲染器
 
@SuppressWarnings({ "rawtypes", "serial" })
public class FriListCellRenderer  extends JLabel implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
 
  User user=(User)value;//把数据转换为user对象,  在AbstractListModel 中传过来的是一个user对象;
  /*******设置JLable的文字******/ 
       String text="<html>"+user.name+"<br/>"+user.motto+" <html/>";
  setText(text);//设置JLable的文字
  /*******设置JLable的图片*****/
  // 得到此图标的 Image,然后创建此图像的缩放版本。
  Image img=user.u.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT);
       setIcon(new ImageIcon(img));//设置JLable的图片
       setIconTextGap(30);//设置JLable的图片与文字之间的距离
       return this;
}
}
为了能够图片的同比例缩放对于图片进行了修改,是他能够匹配JList的大小;
 
图片的缩放方法:
 
Image img = image.getImage();  //得到此图标的 Image(image.getImage())
 img = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);   
 // 创建此图像的缩放版本。
  image.setImage(img);//该图像就设置为得到的缩放版本     
 this.image=image;  
然后为了使JList中的文字能够换行用了HTML格式来设置JLable的text; 
 
3.构建JList
 
        //*创建一个Jlist,显示好友类表**/
        FriListModel buddy = new FriListModel(uArray);
        @SuppressWarnings("rawtypes")
JList buddyList = new JList(buddy);
                //设置单元渲染器
buddyList.setCellRenderer(new FriListCellRenderer());
buddyList.setFont(new Font(Font.SERIF, Font.PLAIN, 18));
        buddyList.setPreferredSize(new Dimension(360, 350));
   /*********给好友列表添加滚动条**************/
JScrollPane jp = new JScrollPane(buddyList);
jp.setPreferredSize(new Dimension(360, 400));
jpanel.add(jp);
这样一个带图片的文字的JList就做好了