今天我們來做一個銀行排隊系統,最后用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();
}
}
}
}

運行結果就是:
用戶客戶端:
銀行工作人員客戶端: