JAVA Swing 关于JList的一点方法

        最近在写数据库的课设,由于轻微的强迫症,把心思放在了美化界面上(美化java写的界面…………)在显示查询航空信息的结果界面时,直接在JList中使用字符串显得很丑,所以想要稍微美化一下,下面是效果的图,为了方便,直接使用了重复的数据。


        具体实现是就是重写单元格渲染,JList的渲染有两种,一直是官方重写好的版本,扩展了JLbel(DefaultListCellRenderer),另一种是一个简单接口,需要自己去完全实现(ListCellRenderer),但可以扩展任何Component,对两种都需要自己去实现函数 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) 参数的含义分别是(从左到右)设置单元格渲染的JList对象,往单元格添加的对象,索引,是否被选择,是否被关注,其中第一个参数一般不用,主要就是关注后几个参数,我实现的例子使用了JLabl,所以下面展示如何用DefaultListCellRenderer:

        新建一个航空信息类:

            

public class FlightItem{
	public String date;
	public String time;
	public String start;
	public String end;
	public String flight_no;
	public int num;
	public String price;
	
	public FlightItem(String flight_no,String start,String end,String date,String time,int num,String price) {
		this.date = date;
		this.time = time;
		this.start = start;
		this.end = end;
		this.flight_no = flight_no;
		this.num = num;
		this.price = price;
	}
}

        用过JLabel的可能都知道,JLabel支持使用html/css,所以我事先尝试了使用html构建结构


效果出来了,重写Renderer:

        

public class Rander extends DefaultListCellRenderer{

	@Override
	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
			boolean cellHasFocus) {
		if(value instanceof FlightItem) {
			FlightItem l = (FlightItem)value;
			String s = l.start.replace(" ", "");
			String e = l.end.replace(" ", "");
String f = "<html><body> <div style=\"word-spacing:1px;width:400px;height:40px;line-height:0px;\">"+
		    "<p style=\"text-indent:2.7cm;\"> %s</p><p style=\"font-size:11px\"> %s      ----------->    %s 价格:%s 剩余:%s</p>"+
		    "<p style=\"text-indent:3.2cm\"> %s<p></div></body></html>";
 = String.format(f,l.date,l.start,l.end,l.price,l.num,l.time);
			setText(f);
		}else {
			setText(null);
		}
		if(isSelected) {
			setBackground(Color.CYAN);
		}else {
			setBackground(Color.WHITE);
		}
		setIcon(new ImageIcon(getClass().getResource("/userframe/flightIcon.png")));
		return this;
		
	}
}

        创建测试

        

public class Test{
    public static void main(String[] args){
	    JFrame rs = new JFrame();
	    rs.setBounds(500,100,400,600);
	    rs.setLayout(null);
	    JPanel p = new JPanel();
	    p.setSize(400,600);
	    p.setLayout(null);
	    rs.add(p);
	    DefaultListModel dlm = new DefaultListModel<>();
	    JList l = new JList<>(dlm);
	    Rander cellRender = new Rander();
			 
	    l.setCellRenderer(cellRender);
	    l.setFixedCellHeight(50);
	    l.setBounds(0,70,400,400);
	    dlm.addElement(new FlightItem("ch123","上海","广州", "2018-6-20", "22:00",200,"570"));
			dlm.addElement(new FlightItem("ch123","上海","广州", "2018-6-20", "22:00",200,"570"));
			dlm.addElement(new FlightItem("ch123","上海","广州", "2018-6-20", "22:00",200,"570"));
			dlm.addElement(new FlightItem("ch123","上海","广州", "2018-6-20", "22:00",200,"570"));
			dlm.addElement(new FlightItem("ch123","上海","广州", "2018-6-20", "22:00",200,"570"));
			dlm.addElement(new FlightItem("ch123","上海","广州", "2018-6-20", "22:00",200,"570"));
	    p.add(l);
	    JScrollPane sp = new JScrollPane(l);
			sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
			sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
			sp.setBounds(0,70,400,400);
			p.add(sp);
	rs.setVisible(true);
	  } 
}
到此结束……


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值