这次练习的小项目是模拟银行的排队系统。别且使用SWT通过UI进行模拟操作
情景再现:当客户来到银行进行办理业务的时候会因为人多产生拥挤的现象,所以银行业务大厅需要一款能够进行排队并且打印出号码的系统,用来解决拥挤现象。但是如果有VIP用户前来办理业务则可以享受优先办理业务的权限。
业务需求:能够进行排队,给每个人编排上正确的号码,VIP用户优先办理。
设计思路:设计一个排队的UI,里面有两个按钮模拟普通客户和VIP用户的区别,点击不同的按钮辨认客户身份,进行不同的编排。设计一个业务员使用的UI,因为在内存层面还不能实现不同窗口中数据的访问,所以设定两个按钮,一个是模拟业务员招待下一个用户,另一个模拟在处理普通业务时有VIP的到来。客户队列使用容器类接口Queue和LinkedList类。使用两个队列,一个是普通客户的队列,另一个是VIP用户的队列。
实现代码如下:
①:创建客户类:
public class Waiter {
private int num; //客户排到的号码
private int frontNum; //客户前面还有多少人
//生成set和get方法,对属性进行封装
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getFrontNum() {
return frontNum;
}
public void setFrontNum(int frontNum) {
this.frontNum = frontNum;
}
}
②:创建Server类,表示现在已经有顾客已经排上好了队:
import java.util.*;
public class QueueServer {
//实例一个普通客户队列
Queue<Waiter> waiterList = new LinkedList<Waiter>();
//普通用户队列添加已经排好队的人
public Queue<Waiter> init()
{
for(int i=1;i<=30;i++){
Waiter w = new Waiter();
w.setNum(i);
w.setFrontNum(i-1);
waiterList.offer(w);
}
return waiterList;
}
}
现在创建UI类:
③:客户排队类:
import java.util.Queue;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
//如果前面的两个类和此类在同一个包则省略下面的import
import com.dr.Queue.QueueServer;
import com.dr.Queue.Waiter;
public class WaiterQueueUI {
public static void main(String args[])
{
//创建窗体,并设置窗体
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setText("俺们的客户端!");
shell.setMaximized(true);
QueueServer qs = new QueueServer(); //初始化server类
final Queue<Waiter> waiterList = qs.init(); //初始化普通客户类
final Queue<Waiter> waiterListVIP = qs.initVIP(); //初始化VIP客户类
//初始化text容器
final Text txt = new Text(shell,SWT.MULTI);
txt.setBounds(400, 50, 500, 450);
txt.setText("欢迎使用客户排队系统");
final Button button = new Button(shell, SWT.Activate); //实例化一个按钮
//对这个按钮添加事件,先判断有没有VIP,然后再处理普通客户队列
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Waiter waiter = new Waiter();
if(waiterListVIP.size() == 0)
{
waiter.setNum(waiterList.size()+1);
}
else
{
waiter.setNum(waiterList.size()+1);}
waiter.setFrontNum(waiterList.size());
waiterList.offer(waiter);
int N = waiter.getNum()+waiterListVIP.size();
int F = waiter.getFrontNum()+waiterListVIP.size();
if(waiterList.size() <= 50){
txt.setText( "您现在排在"+N+"位置上,\n您前面有"+F+"个人,"+"IVP用户为"+waiterListVIP.size()+"人\n请您耐心等候吧!哈哈");
}else{
txt.setText("您前面已经排50个人,请考虑!\n"+"您现在排在"+waiter.getNum()+"位置上,\n您前面有"+waiter.getFrontNum()+"个人\n请您耐心等候吧!哈哈");
}
}
});
button.setBounds(550, 530, 200, 75);
button.setFont(new Font(display,"宋体",12,SWT.BOLD));
button.setText("个人业务");
final Button button1 = new Button(shell, SWT.Activate); //实例化VIP的按钮
//添加事件,并且对VIP队列进行处理
button1.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Waiter waiterVIP = new Waiter();
waiterVIP.setNum(waiterListVIP.size()+1);
waiterVIP.setFrontNum(waiterListVIP.size());
waiterListVIP.offer(waiterVIP);
txt.setText( "您好尊贵的VIP用户,您现在排在VIP"+waiterVIP.getNum()+"号位置上,\n您前面有"+waiterVIP.getFrontNum()+"个VIP用户,\n请您耐心等候");
}
});
button1.setBounds(750, 530, 200, 75);
button1.setFont(new Font(display,"宋体",12,SWT.BOLD));
button1.setText("金卡业务");
shell.layout();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
④:创建业务员使用的UI类:
import java.util.Queue;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
//如果前面的两个类和此类在同一个包则省略下面的import
import com.dr.Queue.QueueServer;
import com.dr.Queue.Waiter;
public class BankWorkerUI {
public static void main(String args[])
{
//创建窗体,并设置窗体
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setText("统统给我排好队!");
QueueServer qs = new QueueServer(); //实例化QueueServer类
final Queue<Waiter> waiterList = qs.init(); //初始化队列
final Queue<Waiter> waiterListVIP = qs.initVIP(); //初始化VIP队列
//初始化text容器
final Text txt = new Text(shell,SWT.MULTI);
txt.setBounds(65, 30, 180, 70);
final Button button = new Button(shell,SWT.Activate);
button.setBounds(90, 141, 100, 25);
button.setText("下一个");
//添加监听事件
button.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
Waiter waiterVIP= waiterListVIP.poll();
if(waiterVIP == null)
{
Waiter waiter = waiterList.poll();
if(waiter!= null){
txt.setText(waiter.getNum()+"号顾客请到1号窗口办理业务");
}else{
txt.setText("没有顾客办理业务了,休息一下.");
}
}
else
{
txt.setText(waiterVIP.getNum()+"号VIP用户客请到1号窗口办理业务");
}
}
});
final Button buttonVIP = new Button(shell,SWT.Activate);
buttonVIP.setBounds(190,141,100,25);
buttonVIP.setText("VIP用户光临");
buttonVIP.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
Waiter waiterVIP = new Waiter();
waiterVIP.setNum(waiterListVIP.size()+1);
waiterVIP.setFrontNum(waiterListVIP.size());
waiterListVIP.offer(waiterVIP);
}
});
shell.layout();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
运行的windows窗体如下:
一:排队的各种情况
初始窗口: 当点击个人业务按钮即普通客户排队时:
点击金卡业务,即VIP用户前来排队时 当继VIP之后又一个普通用户前来排队时
二:业务员端使用情况
初始化的窗体: 点击两次下一个按钮后的情况,而第一次显示1号顾客正在办理
点击VIP光临,模拟VIP已经过来排上队了,但是窗口不反应,因为业务员不知道VIP前来,然后业务员继续点击下一个,则才能显示这个VIP用户,继续点击下一个按钮后VIP处理完毕,继续处理普通客户的业务
后记:通过这个小项目的实战,我学到了Quene接口的使用方法和加深了对监听事件的处理的印象,体现了分布式开发的思想
posted on 2010-10-31 21:45
Soap MacTavish 阅读(1391)
评论(0) 编辑 收藏