自己对这个软件进行了一些改良:从界面和功能上。
以下内容可对比我几个版本的源码进行参考:
一、设置全局字体
上面是第二版的界面。默认样式不太好看。然后我都改成宋体了~
public static void main(String args[]) throws SQLException, ClassNotFoundException {
initGlobalFontSetting(new Font("宋体",Font.PLAIN,18));/*在初始化界面之前加上这句话。*/
addressList frm = new addressList();
frm.setVisible(true);
}
public static void initGlobalFontSetting(Font fnt){ /*网上摘抄方法*/
FontUIResource fontRes = new FontUIResource(fnt);
for(Enumeration<Object> keys = UIManager.getDefaults().keys(); keys.hasMoreElements();){
Object key = keys.nextElement();
Object value = UIManager.get(key);
if(value instanceof FontUIResource)
UIManager.put(key, fontRes);
}
}
二、设置文本框及滚动条
之前的版本,当数据超过规定的尺寸时,就需要手动拉长软件,十分不方便。于是我加上了 JScrollPane,将水平滚动条设置为隐藏,垂直滚动条设置为自动显示,即当数据超出范围才会显示滚动条。
ta = new JTextArea(25,41); //设置文本域尺寸
ta.setLineWrap(true); //自动换行
scrollPane = new JScrollPane(ta); //添加滚动条
scrollPane.setVerticalScrollBarPolicy( //垂直滚动条设置为自动显示
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
还有一个问题:当刷新出的数据超过范围时,滚动条会自动处于最下端,虽然说大部分情况是需要这样的,但是当在浏览一些文档的时候,最好还是从头开始。
解决方案:在超过范围的部分加上这句话就好了。
ta.setCaretPosition(0);
具体在第一个GIF图中的【使用帮助】页面可以看到。
三、设置组件间距:
原因:还是样式问题...有点别扭。右图增加了间距。
解决方案:查询使用的布局文档内的方法。
p = new JPanel(new FlowLayout(FlowLayout.CENTER,10,13));
四、确认框与逻辑更改
在【初始化】这个模块内,添加了确认框功能,以防用户误删数据。同时缓和了,新建数据表与删除数据之间的矛盾。
原因:当用户第一次使用软件时,数据库还未建立,那么应该是建表语句。如果是用户想删除所以已有数据,那么应该是删除语句。但是他们之间的联系是,新建表内是没有数据的,删除所有数据后的表内也是没有数据的。执行他们的结果是一样的,没有数据的数据表。如果已存在表,那么第一个connect会报错然后退出,执行下面语句。如果未存在表,新建表之后再执行。
解决方案:去掉新建表的方法。精简代码。如下:
if(choice()) { /*初始化模块内代码 */
str = "create table myTable(name varchar(20), phone int )";
connect(str);
str = "delete from myTable";
connect(str);
tfname.setText("");
tfphone.setText("");
ta.setText("\n 初始化成功!");
}
boolean choice() { //确认框方法
int n = JOptionPane.showConfirmDialog(this,"确认这样做吗?","确认对话框",
JOptionPane.YES_NO_OPTION );
if(n==JOptionPane.YES_OPTION) return true;
return false;
}
同时也用基本方法,将鼠标点击事件的逻辑更改了:以查找为例。
if(obj==search) {
str ="select * from myTable where name = '"+tfname.getText()+"'";
}
connect(str);
//之前是这么一句话嵌在链接数据库内,用作判断输出数据。
if(!hasName&&!hasPhone||hasName&&hasPhone) str="select * from myTable";
然后改成了这样: 将链接数据库模块与调用分离。
if(obj==search) {
if(name.length()==0&&phone.length()==0) {
str ="select * from myTable";
} else if(name.length()>0&&phone.length()==0){
str ="select * from myTable where name = '"+name+"'";
} else if(name.length()==0&&phone.length()>0) {
str ="select * from myTable where phone = "+phone;
} else {
str ="select * from myTable where name = '"+name+"' and phone = "+phone;
}
}
connect(str);
剩下的部分也是同一个原理更改。
本来想让鼠标点击事件调用外部类,结果说是线程过多,于是就没有考虑了。
END.
具体代码我已经上传至我的 Github【someTools】项目内的【addressList】文件夹内。包含目前三版的原代码和 jar 文件。
Github 地址:https://github.com/evenIfAlsoGo/someTools/tree/master/addressList