JList动态添加元素

 
http://www.cnblogs.com/tianguook/archive/2012/01/31/2333992.html
https://zhuanlan.zhihu.com/p/24676104

学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就做好了

最后,来看一看效果:

 

原文地址:https://www.cnblogs.com/kungfupanda/p/7726907.html