zoukankan      html  css  js  c++  java
  • JAVA实现带图片的列表——JList

    JList:显示对象列表并且允许用户选择一个或多个项的组件。

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

    最后,来看一看效果:

  • 相关阅读:
    OS第6次实验报告:使用信号量解决进程互斥访问
    操作系统第5次实验报告:内存管理
    OS第4次实验报告:文件系统
    OS第3次实验报告:命名管道
    Derby小记
    eclipse连接SQL Server2012
    录屏工具——Captura
    OS第2次实验报告:创建进程
    OS第1次实验报告:熟悉使用Linux命令和剖析ps命令
    第四次实验报告:使用Packet Tracer理解RIP路由协议
  • 原文地址:https://www.cnblogs.com/hesi/p/6242699.html
Copyright © 2011-2022 走看看