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

最后,来看一看效果:

JList动态添加元素的更多相关文章

  1. Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法

    Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法 2014-03-27 11:44:46|  分类: Easy UI|举报|字号 订阅     可以使用$.parser.pa ...

  2. Jquery Mobile 动态添加元素然后刷新 转

    Jquery Mobile 动态添加元素然后刷新 (2013-05-09 12:39:05) 转载▼ 标签: it 分类: Mobile jquery 表单元素每一个元素都有自己刷新的方法,每当改变它 ...

  3. jquerymobile动态添加元素之后不能正确渲染解决方法

    jquerymobile动态添加元素之后有些不能被正确渲染的解决方法: listview:               添加 jq(".detail").listview(&quo ...

  4. angular.element方法汇总以及AngularJS 动态添加元素和删除元素

    addClass()-为每个匹配的元素添加指定的样式类名after()-在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点append()-在每个匹配元素里面的末尾处插入参数内容att ...

  5. js 动态添加元素(div、li、img等)及设置属性

    把一串 html 标签赋给一个 javascript 变量,除属性的值要用转义的双引号外,某些时候字符串还很长,显得有些复杂.如果用 js 动态添加元素,就不会有那么复杂的字符串出现,代码阅读性强一点 ...

  6. jquery动态添加元素无法触发绑定事件的解决方案。

    jquery动态添加元素无法触发绑定的事件的解决方案. ╭(●`∀´●)╯二狗最近在工作中遇到一个问题,即当用jquery动态添加元素后,发现给动态添加的元素却无法触发事件(╯#-_-)╯╧═╧ ( ...

  7. jQuery动态添加元素事件

    在项目中遇到需要jQuery动态添加元素的事件,做了一个demo,方便以后遇到相同的问题可以用上: <!DOCTYPE html> <html> <head> &l ...

  8. jqueryMobile 动态添加元素,展示刷新视图方法

    jqueryMobile动态添加元素jqueryMobile郏高阳 jQuery Mobile的是一个很好的移动开发框架,你可能已经知道,虽然它有很多难以解决的问题,但是我相信后续版本jquery会修 ...

  9. AngularJs动态添加元素和删除元素

    动态添加元素和删除元素 //通过$compile动态编译html var html="<div ng-click='test()'>我是后添加的</div>" ...

随机推荐

  1. 查看Linux 版本

     如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux v ...

  2. Java转义emoji等特殊符号

    写在前面 网上找了很多转emoji等方法,大多有两种方法 更改数据库编码格式为utf8mb4 过滤字符串中的emoji 都不是很优雅 更改数据库编码,势必影响其他数据库 过滤emoj效率比较低 处理E ...

  3. mybatis框架下物理分页的实现(整个工程采用的是springmvc、spring、mybatis框架,数据库是mysql数据库)

    (一)关于分页拦截器的简单理解 首先,要开发MyBatis的插件需要实现org.apache.ibatis.plugin.Interceptor接口,这个接口将会要求实现几个方法:intercept( ...

  4. VC++窗口创建过程,图形绘制,时钟程序

    创建窗口步骤: (1)注册窗口类(RegisterClassEx) (2)创建窗口(CreateWindowEx) (3)在桌面显示窗口(ShowWindow) (4)更新窗口客户区(UpdateWi ...

  5. QYH练字

    汉字书写笔划,提取自百度汉语等网站... 以下凑字数: [发文说明]博客园是面向开发者的知识分享社区,不允许发布任何推广.广告.政治方面的内容.博客园首页(即网站首页)只能发布原创的.高质量的.能让读 ...

  6. 【ibatis】入门讲例

    Ⅰ .Ibatis项目机构 打开资源包,可以看到里面有一个simple_exzample的文件夹,在MyEclipse8.5中新建一个JAVA项目,将刚才的文件夹中内容复制到项目SRC下,这样的话呢, ...

  7. mybatis-plus排除非表中字段

    使用 transient 修饰 private transient String noColumn; 使用 static 修饰 private static String noColumn; 使用 T ...

  8. Java 强制类型转换

    java提高篇(十一)-----强制类型转换 在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可 ...

  9. C++ 中std::function 、std::bind的使用和lambda的使用

    std::function是可调用对象的包装器:std::bind是将可点用对象和其参数一起进行绑定,且绑定后的结果可以使用std::function对象进行保存,并延迟调用到需要调用的时候: 在C+ ...

  10. vue-infinite-loading2.0 中文文档

    简介 这是一个使用在Vue.js中的无限滚动插件,它可以帮助你快速创建一个无限滚动列表. 特点 移动端支持友好 兼容任何一个可以滚动的元素 有不同的旋转器可以作为加载动画 支持加载后显示结果 支持两个 ...