今天我们来做一个银行排队系统,最后用swt实现图形界面功能。
先来分析:我们做银行排队系统,需要分为银行工作人员,办理业务的用户(包括普通用户和金卡用户),除此之外,还需要一个服务器用来存储排队的用户队列。
细细分析:
银行工作人员有三个属性(id,姓名,需要处理的病人)和一个方法(办理业务);用户有两个属性(排队号码,排在自己前面的人数),此外,金卡用户可以排在普通用户的前面。
服务器最不好写,我们需要两个队列,满足用户的先来先办理业务的需求(一个队列存储普通用户队列,一个队列存储金卡用户队列),我们还需要一个初始化队列的方法,把一些普通用户和金卡用户初始化进去。
再说UI上的处理:
1.在用户客户端,用户只需要关心我排在第几号,我前面有几个人就可以了,因此在用户客户端,我们就在点击事件监听器中把服务器中的初始化普通用户队列取过来,队列的容量就是当前用户前面的人数,队列数加1就是当前用户的号码,需要注意的是,当金卡用户来的时候,他会自动排在前面,所以每天加一个金卡用户队列里的金卡用户的时候,普通用户的队列也要添加该用户,我们只需要做一个小处理就能实现该功能,将金卡用户继承普通用户,即可实现在普通用户队列里添加金卡用户。
2.在银行工作人员客户端,工作人员只需关心我还要处理多少用户即可,因此需要将服务器上的两个队列取过来,并且先办理金卡用户的业务,只有当金卡用户为空的时候才开始办理普通用户的业务,因此需要写一些if和else的语句来判断金卡或者普通用户是否为空的情况。
下面附代码:
银行工作人员:
package com.dr.goldcardqueue;
public class BankWorker {
private int id;
private Waiter waiter;
public BankWorker(Waiter waiter){
this.setWaiter(waiter);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Waiter getWaiter() {
return waiter;
}
public void setWaiter(Waiter waiter) {
this.waiter = waiter;
}
public void handlBusiness(){
System.out.println("我正在处理第"+(this.waiter.getNumber()+1)+"号顾客业务");
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("我已经处理完第"+(this.waiter.getNumber()+1)+"号顾客业务");
System.out.println("请下一位顾客到第"+(this.id+1)+"号窗口办理业务");
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
普通用户:
package com.dr.goldcardqueue;
public class Waiter {
private int number;
private int frontnumber;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getFrontnumber() {
return frontnumber;
}
public void setFrontnumber(int frontnumber) {
this.frontnumber = frontnumber;
}
}
金卡用户:
package com.dr.goldcardqueue;
public class GoldWaiter extends Waiter{
private int number;
private int frontnumber;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getFrontnumber() {
return frontnumber;
}
public void setFrontnumber(int frontnumber) {
this.frontnumber = frontnumber;
}
}
服务器:
package com.dr.goldcardqueue;
import java.util.LinkedList;
import java.util.Queue;
public class Server {
public Queue<Waiter> waiterlist = new LinkedList<Waiter>();
public Queue<GoldWaiter> goldwaiterlist = new LinkedList<GoldWaiter>();
public Queue<Waiter> init(){
Waiter waiter = null;
for(int i=1;i<15;i++){
waiter = new Waiter();
waiter.setNumber(i);
waiter.setFrontnumber(i-1);
waiterlist.offer(waiter);
}
return waiterlist;
}
public Queue<GoldWaiter> goldinit(){
GoldWaiter goldwaiter = null;
for(int i=1;i<5;i++){
goldwaiter = new GoldWaiter();
goldwaiter.setNumber(i);
goldwaiter.setFrontnumber(i-1);
goldwaiterlist.offer(goldwaiter);
}
return goldwaiterlist;
}
}
用户客户端UI:
package com.dr.goldcardqueue;
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;
public class WaiterQueueUI {
public static void main(String[] args){
Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setMaximized(true);
shell.setText("银行排队之等待者客户端");
final Text text = new Text(shell,SWT.MULTI);
text.setBounds(500, 100, 300, 300);
Server server = new Server();
final Queue<Waiter> waiterlist = server.init();
final Queue<GoldWaiter> goldwaiterlist = server.goldinit();
Button button1 = new Button(shell,SWT.Activate);
button1.setBounds(350, 530, 200, 75);
button1.setText("个人业务办理");
button1.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
Waiter w = new Waiter();
w.setNumber(waiterlist.size()+1);
w.setFrontnumber(waiterlist.size());
waiterlist.offer(w);
if(waiterlist.size()<=50){
text.setText("您现在排在"+w.getNumber()+"位置上,\n您前面有"+w.getFrontnumber()+"个人\n请您耐心等候吧!哈哈");
}
else{
text.setText("您前面已经排50个人,请考虑!\n"+"您现在排在"+w.getNumber()+"位置上,\n您前面有"+w.getFrontnumber()+"个人\n请您耐心等候吧!哈哈");
}
}
});
Button button2 = new Button(shell,SWT.Activate);
button2.setBounds(750, 530, 200, 75);
button2.setText("金卡个人业务办理");
button2.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
GoldWaiter gw = new GoldWaiter();
gw.setNumber(goldwaiterlist.size()+1);
gw.setFrontnumber(goldwaiterlist.size());
goldwaiterlist.offer(gw);
waiterlist.offer(gw);
if(goldwaiterlist.size()<=50){
text.setText("您现在排在"+gw.getNumber()+"位置上,\n您前面有"+gw.getFrontnumber()+"个人\n请您等候!");
}
else{
text.setText("您前面已经排超过50人了,请考虑!\n"+"您现在排在"+gw.getNumber()+"位置上,\n您前面有"+gw.getFrontnumber()+"个人\n请您耐心等候吧!哈哈");
}
}
});
shell.layout();
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch()){
display.sleep();
}
}
}
}
银行工作人员客户端UI:
package com.dr.goldcardqueue;
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;
public class BankWorkerUI {
public static void main(String[] args){
Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setMaximized(true);
shell.setText("银行工作人员客户端");
final Text text = new Text(shell,SWT.MULTI);
text.setBounds(500, 100, 300, 300);
Server server = new Server();
final Queue<Waiter> waiterlist = server.init();
final Queue<GoldWaiter> goldwaiterlist = server.goldinit();
final Button button = new Button(shell,SWT.Activate);
button.setBounds(550, 530, 200, 75);
button.setText("下一个用户");
button.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
if(waiterlist!=null){
GoldWaiter gw = goldwaiterlist.poll();
if(gw!=null){
text.setText("请"+gw.getNumber()+"号VIP顾客请到1号窗口办理业务");
}
else{
Waiter w = waiterlist.poll();
if(w!= null){
text.setText("请"+w.getNumber()+"号普通顾客请到1号窗口办理业务");
}
else{
text.setText("现在没有人办理业务了,您可以休息会了\n 喝杯咖啡吧,哈哈!");
}
}
}
}
});
shell.layout();
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch()){
display.sleep();
}
}
}
}
运行结果就是:
用户客户端:
银行工作人员客户端: