最近在写数据库的课设,由于轻微的强迫症,把心思放在了美化界面上(美化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);
}
}到此结束……

1146

被折叠的 条评论
为什么被折叠?



