【前言】
我再次捡起swing,因为跨平台,低成本---并非说开发成本,而是说配套使用的服务器,数据库,开发工具等成本,这方面微软是力有不及。
然后搞了一个代码生成器的界面----假如您看了前面的文章的话,您一定会对代码生成器这个词语非常熟悉,对,我就是在各种平台各个语言下面不停造轮子,不停搞代码生成器。
【JLIst】
因为需要显示常用的数据库连接给用户进行选择,并且需要改一改样式----swing本身的样式无论任何时候看都觉得丑陋,所以也需要改写单元格了,下面说明jlist的使用方式。
jlist是 m v c 分离方式的,它有一个模型列表数据,然后有自己默认的渲染方式。
下面说明用法:
ConnectionDAL cDal=new ConnectionDAL();
List<ConnectionModel> modelList= cDal.getList();
//定义一个默认的模型列表,它已经帮我们实现了属性改变等事件了,
//然后在里面放进去我们需要的数据。
_dbModelList=new DefaultListModel<DBRecordInfo>();
for(ConnectionModel ctmp : modelList) {
DBRecordInfo iinfoInfo=new DBRecordInfo();
iinfoInfo.recordId=ctmp.id;
iinfoInfo.name=ctmp.title;
iinfoInfo.dbtype=ctmp.dbtype;
_dbModelList.addElement(iinfoInfo);
}
//设定模型为我们刚刚定义好的模型列表
_dbList.setModel(_dbModelList);
//我们改写了默认的显示方式
_dbList.setCellRenderer(new dbListCell());
//定义这个JList的鼠标事件
_dbList.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
DBRecordInfo selectedInfo=(DBRecordInfo)_dbList.getSelectedValue();
_BindTreeList();
}
});
上面的步骤总结为:
1、定义一个实体类,用于承载需要显示的数据,然后定义默认的listmodel,放进去;
2、自定义jlist的单元格显示方式;
3、定义jlist的鼠标事件。
【1、模型】
/**
* 针对db list的模型
* */
class DBRecordInfo{
public String name;
public int recordId;
public String dbtype="";
public String toString(){
return this.name+"【"+dbtype+"】";
}
}
上面就是模型了,我通过读取写入sqlite数据库来更新,保存或者获得用户输入的连接方式,然后赋值给这个实体类,再添加进listmodel,比起wpf的绑定有很大距离,一个简单的事情搞复杂了。
【2、自定义渲染方式】
/**
* 定制swing里面dblist的cell单元格如何显示
* */
class dbListCell extends JLabel implements ListCellRenderer<DBRecordInfo>{
public ImageIcon _bgIcon;
@Override
public Component getListCellRendererComponent(
JList<? extends DBRecordInfo> list, DBRecordInfo value,
int index, boolean isSelected, boolean cellHasFocus) {
_bgIcon= appConfig.getResourceIcon("database_icon.png", 32, 32);
setText(value.name+"("+value.dbtype+")");
setIcon(_bgIcon);
//判断是否选中
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setEnabled(list.isEnabled());
setFont(list.getFont());
setOpaque(true);
return this;
}
}
值得注意的是,在定制的时候,我们需要分别对是否选中的情况进行区别处理,譬如:选中的时候背景颜色不一样等等。
【3、鼠标点击事件】
刚才已经将点击事件贴出来,现在看看如何处理:
DBRecordInfo selectedInfo=(DBRecordInfo)_dbList.getSelectedValue();
_BindTreeList();
注意:我们可以用强制转换的方式来获得选中的记录,至于下面的方法是另一个环节了,那就是jtree的用法。
下面附上swing的代码生成器的界面---有点丑: