1,首先创建登录页面;
中间的一些小技巧;
shell.setLocation(centerPoint); //使窗口定位在中间
给退出按钮绑定监听事件:会弹出一个信息框,是否确定退出:
button.addSelectionListener(new SelectionAdapter() {
//退出按钮
public void widgetSelected(SelectionEvent e) {
//1,系统退出
MessageBox mb=new MessageBox(shell, SWT.YES|SWT.NO);//弹出一个信息框,判断是否退出
mb.setText(“确定退出吗?”); //这里的yes No 代表两个按钮
mb.setMessage(“退出”);
int result=mb.open();
if(result==SWT.YES){
System.exit(0);
}
}
});
给登录按钮邦定监听事件,使其点击能够验证用户名,及密码,还有页面的跳转:
需要注意的事这里密码提交到数据库时,使用了加密代码,由工具算法Encrypt提供
其中YcUtil为一个日志文件,用来记录登录 成功与错误 等。
SWTUtil是一个封装的帮助方法里面有:
弹出一个信息框显示 提示信息 showMessageBox
让窗口最大化 maxScreen shell.setLocation(0, 0);//设置窗口的定位
让窗口居中显示 centerScreen 让窗口居中显示 算法: ( 屏幕宽-窗口宽)/2 返回一个点
1,给SQL语句用params添加参数 ,并拿参数与数据库中的实际进行比较验证
2,Params 一个用来存用户信息的类
3,关闭当前的页面,并且创建一个新页面,直接显示主页面
button_1.addSelectionListener(new SelectionAdapter() {
//登录按钮
public void widgetSelected(SelectionEvent e) {
//先取出用户名text 密码text_1
String rname=text.getText().trim().toString(); //获取第一个文本框的输入信息
String rpwd=text_1.getText().trim().toString();
//判断两个文本框是否为空
if( rname==null||”“.equals(rname)){
SWTUtil.showMessageBox(shell, “出错了!”,”用户名不能为空”);
return;
}
if( rpwd==null||”“.equals(rname)){
SWTUtil.showMessageBox(shell, “出错了!”,”密码不能为空”);
return;
}
//使用dbhelp查询数据库
//2.1 sql语句: select * from rename=? and rpwd=?;
String sql=”select * from resadmin where rname=? and rpwd=?”;
Listparams=new ArrayList();
params.add(rname);
params.add(Encrypt.md5(rpwd));//生成32位加密密码
DBHelp db=new DBHelp();
try {
List> list=db.findAll(sql, params);
if(list==null||list.size()<=0){
SWTUtil.showMessageBox(shell, “登录失败”, “用户或密码错误,请重新输入。。。。。。”);
YcUtil.logger.error(rname+”登录失败”);
}else{
SWTUtil.showMessageBox(shell, “登录成功”, “欢迎您”+rname);
YcUtil.logger.info(rname+”登录成功”);
//保存登录的用户信息到静态变量中
Map user=list.get(0);//取到数组的第一个
Params.rid=user.get(“RID”);
Params.rname=user.get(“RNAME”);
Params.rpwd=rpwd;
//Todo: 切换到后台的主页面。。。。
Login.this.shell.setVisible(false); //隐藏此页面
Login.this.shell.dispose(); //关闭此页面
BackMain bm=new BackMain(); //创建一个新的页面,并且固定住主页面
bm.open();
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
SWTUtil.showMessageBox(shell, “登录失败”,”数据库访问出错了,信息如下:”+e1.getMessage());
}
}
});
2,跳转到主页面:
第一大面板:放置树节点
通过对树节点的选择事件来跳转面板:
//树的节点
tree.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
//1取出当点的是树的按个节点
TreeItem[] tis=tree.getSelection();
if( this==null||tis.length<=0){
SWTUtil.showMessageBox(shell, “出错了”, “请至少选择一个节点”);
return;
}
TreeItem ti=tis[0]; //只有第一个节点有意义
//取出这个节点 text
String txt=ti.getText();
//3.判断是那个节点
if(txt.equals(“修改密码”)){
sl.topControl=pcc; //运行到这里会跳转到pcc页面
}else if(txt.equals(“类别管理”)){
sl.topControl=tmc;
}else if(txt.equals(“商品管理”)){
sl.topControl=pmc;
}
composite_2.layout(); //重新刷新composite_2布局 才可以动态显示
}
});
第二大面板:private StackLayout sl; //堆栈式布局
//创建堆栈式布局的对象
sl=new StackLayout();
里面再套面板(主面板,密码修改面板,商品管理面板。。。。。)
创建以上面板: private ProManCon pmc; //商品管理面板
//创建四块面板: 第一个参数表示这块面板要放在那个容器中,这里是放在第二大块面板里
pmc=new ProManCon (composite_2 ,SWT.None);
sl.topControl:控制面板的显示
sl.topControl=mc; //先显示主版面
第三大面板:介绍了一点点的线程操作:
因为是多块同时运行所以要运用到线程
用填充的放式里面放了一个label:
再利用线程将时间设置进来,
new Thread( new Runnable(){
@Override
public void run() {
while(flage){
//显示当前时间
SimpleDateFormat sdf=new SimpleDateFormat(“yyyy年MM月dd日HH:mm:ss”);
Date d=new Date();
dstring=sdf.format(d);
//在新线程不能直接操作主线程中的组件 可以绕一下
//label就属于主线程的组件
Display为一个对象 负责和操作系统之间的通信
Display.getDefault().asyncExec(new Runnable(){
public void run() {
//因为多线程是异步操作的,所以在操作label前要判断label的状态
if(label!=null&&label.isDisposed()==false){//判断主组件是否为空且没有被释放
label.setText(dstring);//就是对组件经行操作
}
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
).start();
第二大面板:中的小版面
修改密码版面:
这里主要就是给修改按钮添加监听事件
首先要根据对应的文本框取出对应的用户信息
再拿这些信息与静态变量中的进行比较是否一致,以此来确定是否修改
修改后将静态变量中的值进行更新,以及将文本框情空
button.addSelectionListener(new SelectionAdapter() {
@Override//给按钮添加监听事件
public void widgetSelected(SelectionEvent e) {
//取出用户名,原密码,新密码
String rname=text.getText().trim().toString();
String oldpwd=text_1.getText().trim().toString();
String newpwd=text_2.getText().trim().toString();
//不能为空
if(rname==null||”“.equals(rname)){
SWTUtil.showMessageBox(parent.getShell(),”出错了”,”用户名不能为空”);
return;
}
if(oldpwd==null||”“.equals(oldpwd)){
SWTUtil.showMessageBox(parent.getShell(),”出错了”,”原密码不能为空”);
return;
}
if(newpwd==null||”“.equals(newpwd)){
SWTUtil.showMessageBox(parent.getShell(),”出错了”,”新密码不能为空”);
return;
}
//1,判断用户与原密码是否与静态变量中保持一致
if(!rname.equals(Params.rname) ||!oldpwd.equals(Params.rpwd)){
SWTUtil.showMessageBox(parent.getShell(),”出错了”,”输入的原用户名与密码不相同”);
return;
}
// 再修改新密码
DBHelp db=new DBHelp();
String sql=”update resadmin set rname=?,rpwd=? where rid=?”;
Listparams=new ArrayList();
params.add(rname);
params.add(Encrypt.md5(newpwd));
params.add(Params.rid);
try {
int result=db.doUpdate(sql, params);
if(result>0){
SWTUtil.showMessageBox(parent.getShell(),”成功”,”修改密码成功”);
Params.rname=rname; //修改立即将其更新,否则在没重新登录的情况下不能再操作
Params.rpwd=newpwd;
text.setText(“”); //将其清空
text_1.setText(“”);
text_2.setText(“”);
}
else{
SWTUtil.showMessageBox(parent.getShell(),”出错了”,”修改密码失败”);
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
SWTUtil.showMessageBox(parent.getShell(),”出错了”,”修改密码失败,原因:”+e1.getMessage());
}
}
});
类别管理面板: 又分为三大面板
面板1:
(1)主要是给查询按钮添加监听事件:
先取出对应文本框的信息
特别要注意sql语句的书写;
首先是什么都不输入即是对所有的查询
然后是添加类别名作为条件查询
加入描述时还要判断类别名是否为空,条件是不同的
然后是在列表里面输出: 里面有些小技巧,比如将上一次查询 的清空 ,如何设置列表显示
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String tname=text.getText().trim().toString();
String tdesc=text_1.getText().trim().toString();
//
//
//
//
//where rtname=’湘菜’or rtdesc like’%好%’
//group by rtype.rtid,rtname,rtdesc
String sql=”select rtype.rtid ,rtype.rtname,rtype.rtdesc,count(cid) as countnumber from rtype left join commodity on rtype.rtid=commodity.rtid where 1=1”;
Listparams=new ArrayList();
if(tname!=null&&!”“.equals(tname)){
sql+=” and rtname=?”;
params.add(tname);
}
if(tdesc!=null&&!”“.equals(tdesc)){
if(tname!=null&&!”“.equals(tname)){
sql+=” or “;
}else{
sql+=” and “;
}
sql+=” rtdesc like ?”;
params.add(“%”+tdesc+”%”);
}
sql+=” group by rtype.rtid,rtname,rtdesc”;
DBHelp db=new DBHelp();
try {
List> list= db.findAll(sql, params);
if(list!=null&&list.size()>0){
table.removeAll();//清空以前显示的
for(Map map : list){
//在列表里面输出
TableItem tableItem = new TableItem(table, SWT.NONE);
tableItem.setText(new String[]{ map.get(“RTID”),map.get(“RTNAME”),map.get(“RTDESC”),map.get(“COUNTNUMBER”)});
}
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
SWTUtil.showMessageBox(parent.getShell(), “查询错误”, “查询失败”);
}
}
});
面板3:
(1),给添加按钮添加监听事件
因为有几项是自动生成的,所以只要取对应两个框的信息
这里还将查询按钮进行了事件的绑定,即点击添加的同时触发查询按钮
private Event event;
event=new Event();
event.widget=button;//将事件与按钮绑定在一起
button_1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String tname=text_3.getText().trim().toString();
String tdesc=text_4.getText().trim().toString();
if(tname==null||”“.equals(tname)){
SWTUtil.showMessageBox(parent.getShell(), “出错了”,”类别名不能为空”);
return;
}
if(tdesc==null||”“.equals(tdesc)){
SWTUtil.showMessageBox(parent.getShell(), “出错了”,”类别名不能为空”);
return;
}
String sql=”insert into rtype (rtid,rtname,rtdesc) values(?,?,?)”;
String tid=UUID.randomUUID().toString();
Listparams=new ArrayList();
params.add(tid);
params.add(tname);
params.add(tdesc);
DBHelp db=new DBHelp();
try {
int result=db.doUpdate(sql, params);
if(result>0){
SWTUtil.showMessageBox(parent.getShell(), “添加类别成功”,”添加编号为:”+tid+”的类别信息成功”);
text_3.setText(“”);
text_4.setText(“”);
//添加绑定事件
button.notifyListeners(SWT.Selection, event);
}else{
SWTUtil.showMessageBox(parent.getShell(), “添加类别失败”,”的类别信息失败”);
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
SWTUtil.showMessageBox(parent.getShell(), “添加类别失败”,”原因”+e1.getLocalizedMessage());
}
}
});
(2)更新按钮:
首先应该给表格添加点击事件: //取出当前选定的行 =》取出数据
然后再进行更新操作,同样给更新操作加入查询按钮的绑定 更新也只能改 类别名 和 描述
//给表格加入点击事件
table.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
//取出当前选定的行 =》取出数据
TableItem[] tis=table.getSelection();
if(tis==null||tis.length<=0){
return;
}
TableItem ti=tis[0];
//将这4个数据加到文本框中
text_2.setText(ti.getText(0)); //编号
text_3.setText(ti.getText(1)); //类别
text_4.setText(ti.getText(2)); //描述
text_5.setText(ti.getText(3)); //所属商品数量
}
});
//更新按钮
button_2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String tid=text_2.getText().trim().toString();
String tname=text_3.getText().trim().toString();
String tdesc=text_4.getText().trim().toString();
if(tid==null||”“.equals(tid)){
SWTUtil.showMessageBox(parent.getShell(), “出错了”, “类别编号不能为空”);
}
if(tid.equals(“0”)){
SWTUtil.showMessageBox(parent.getShell(), “出错了”, “类别编号为0的不能改这是基础数据”);
return;
}
if(tname==null||”“.equals(tname)){
SWTUtil.showMessageBox(parent.getShell(), “出错了”, “类别名不能为空”);
}
//真正的更新
String sql=”update rtype set rtname=?, rtdesc=? where rtid=?”;
Listparams=new ArrayList();
params.add(tname);
params.add(tdesc);
params.add(tid);
DBHelp db=new DBHelp();
try {
int result=db.doUpdate(sql, params);
if(result>0){
SWTUtil.showMessageBox(parent.getShell(), “恭喜您”,”更新”+tid+”成功”);
text_2.setText(“”);
text_3.setText(“”);
text_4.setText(“”);
text_5.setText(“”);
//添加绑定事件
button.notifyListeners(SWT.Selection, event);
}else{
SWTUtil.showMessageBox(parent.getShell(), “更新失败”,”更新”+tid+”失败”);
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
YcUtil.logger.error(“更新”+tid+”失败原因:”+e1.getMessage());
SWTUtil.showMessageBox(parent.getShell(), “更新失败”,”更新”+tid+”失败”);
}
}
});
面板2:
给表格添加右键弹出删除类别功能:
先给表格添加一个菜单 然后在 菜单 上继续添加 子菜单
然后给子菜单添加监听事件
先取在表中选定的行
让用户判断是否真的删除
编号为0 的类别不能删除
删除时如果类别中有商品,先将商品移到 0号 类别下 然后再对类别经行删除
其中还用了隐事事务的关闭,以保证数据的安全
//删除类别
menuItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
//1取出表格中选定的行
TableItem [] tis= table.getSelection();
//2,判断是否选了至少一行
//2如果没有选则报错
if(tis==null|| tis.length<=0){
SWTUtil.showMessageBox(parent.getShell(), “出错了”, “请至少选定一行”);
return ;
}
//询问用户是否真的删除
MessageBox mb=new MessageBox(parent.getShell(), SWT.YES| SWT.NO);
mb.setText(“确定删除”);
mb.setMessage(“删除后不可恢复”);
int result =mb.open();
if(result==SWT.NO){
return;
}
//先修改商品表中所有的这个类别的商品改为0类别
String rtid=tis[0].getText(0); //取出要删除的类别的编号(选定的第一行第一列)
//编号为0 的不能删除
if(rtid!=null&& rtid.equals(“0”)){
SWTUtil.showMessageBox(parent.getShell(), “删除失败”, “编号为0的是基础数据,不能删除,请与管理员联系”);
return;
}
String sql=” update commodity set rtid=’0’ where rtid= ?”;
Listparams =new ArrayList();
params.add(rtid);
//再删除当前类别
String sql2=”delete from rtype where rtid=?”;
Listparams2 =new ArrayList();
params2.add(rtid);
List sqls=new ArrayList();
sqls.add(sql);
sqls.add(sql2);
List> paramsList=new ArrayList>();
paramsList.add(params);
paramsList.add(params2);
DBHelp db=new DBHelp();
try {
db.doUpdate(sqls, paramsList);
SWTUtil.showMessageBox(parent.getShell(), “操作成功”,”删除类别成功”);
button.notifyListeners(SWT.Selection, event);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
SWTUtil.showMessageBox(parent.getShell(), “出错了”,e1.getMessage());
}
}
});
商品管理面板:
这里有个给表格添加删除菜单,将鼠标放到表格上点击右键,就能弹出删除菜单,
menuItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
//先取出要删除的行
TableItem[] tis=table.getSelection();
if(tis==null&&tis.length<=0){
return;
}
//从行中取出编号
TableItem ti=tis[0];
String cid=ti.getText(4);
MessageBox mb=new MessageBox(parent.getShell(),SWT.OK|SWT.CANCEL);
mb.setText(“确定要删除吗?”);
mb.setMessage(“删除后数据不可恢复。。。”);
int r=mb.open();
if(r==SWT.CANCEL){
return;
}
//SQL语句
String sql=”delete from commodity where cid=? “;
Listparams=new ArrayList();
params.add(cid);
//调用dbhelp
DBHelp db=new DBHelp();
try {
int result=db.doUpdate(sql, params);
if(result>0){
SWTUtil.showMessageBox(parent.getShell(), “删除成功”, “删除成功”);
}else{
SWTUtil.showMessageBox(parent.getShell(), “删除失败”, “删除失败”);
}
//再查询一次
button_3.notifyListeners(SWT.Selection, event);
//隔山打牛点击查询
Params.button.notifyListeners(SWT.Selection, event);
} catch (Exception e1) {
e1.printStackTrace();
YcUtil.logger.error(e1);
SWTUtil.showMessageBox(parent.getShell(), “删除失败”, e1.getMessage());
}
}
});
还有一个重点是 浏览按钮 用来添加图片
首先要取出用户的路径,再将路径设置到文本框
然后用流的技术来读取图片,这里注意两次加载了图片,因为要考虑到适应文本框
//浏览按钮
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
//1显示文件选择对话框
FileDialog dialog = new FileDialog(parent.getShell(),SWT.OPEN);
String userhome=System.getProperty(“user.home”);
dialog.setFilterPath(userhome);//设置初始路径
String fileName=dialog.open();
if(fileName==null|| “”.equals(fileName)){
return;
}
//取出用户的路径
//将路径设置到文本框
text_5.setText(fileName);
//将图片显示在label中
//根据flieName取出输入流
try {
FileInputStream fis=new FileInputStream( new File(fileName));
ImageData imageData=new ImageData(fis);
//重新定义一张图片用来接收修改后的图片,因为有些图片大小不一,所以将图片适应文本框
ImageData newimagedata=imageData.scaledTo(label_10.getBounds().width,label_10.getBounds().height);
Image image=new Image (parent.getDisplay(),newimagedata);
label_10.setImage(image);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
SWTUtil.showMessageBox(parent.getShell(), “显示图片出错了”, “请与管理员联系”);
}
}
});