今天我們來做一個(gè)銀行排隊(duì)系統(tǒng),最后用swt實(shí)現(xiàn)圖形界面功能。
先來分析:我們做銀行排隊(duì)系統(tǒng),需要分為銀行工作人員,辦理業(yè)務(wù)的用戶(包括普通用戶和金卡用戶),除此之外,還需要一個(gè)服務(wù)器用來存儲排隊(duì)的用戶隊(duì)列。
細(xì)細(xì)分析:
銀行工作人員有三個(gè)屬性(id,姓名,需要處理的病人)和一個(gè)方法(辦理業(yè)務(wù));用戶有兩個(gè)屬性(排隊(duì)號碼,排在自己前面的人數(shù)),此外,金卡用戶可以排在普通用戶的前面。
服務(wù)器最不好寫,我們需要兩個(gè)隊(duì)列,滿足用戶的先來先辦理業(yè)務(wù)的需求(一個(gè)隊(duì)列存儲普通用戶隊(duì)列,一個(gè)隊(duì)列存儲金卡用戶隊(duì)列),我們還需要一個(gè)初始化隊(duì)列的方法,把一些普通用戶和金卡用戶初始化進(jìn)去。
再說UI上的處理:
1.在用戶客戶端,用戶只需要關(guān)心我排在第幾號,我前面有幾個(gè)人就可以了,因此在用戶客戶端,我們就在點(diǎn)擊事件監(jiān)聽器中把服務(wù)器中的初始化普通用戶隊(duì)列取過來,隊(duì)列的容量就是當(dāng)前用戶前面的人數(shù),隊(duì)列數(shù)加1就是當(dāng)前用戶的號碼,需要注意的是,當(dāng)金卡用戶來的時(shí)候,他會自動排在前面,所以每天加一個(gè)金卡用戶隊(duì)列里的金卡用戶的時(shí)候,普通用戶的隊(duì)列也要添加該用戶,我們只需要做一個(gè)小處理就能實(shí)現(xiàn)該功能,將金卡用戶繼承普通用戶,即可實(shí)現(xiàn)在普通用戶隊(duì)列里添加金卡用戶。
2.在銀行工作人員客戶端,工作人員只需關(guān)心我還要處理多少用戶即可,因此需要將服務(wù)器上的兩個(gè)隊(duì)列取過來,并且先辦理金卡用戶的業(yè)務(wù),只有當(dāng)金卡用戶為空的時(shí)候才開始辦理普通用戶的業(yè)務(wù),因此需要寫一些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)+"號顧客業(yè)務(wù)");
        
try{
            Thread.sleep(
1000);
        }
catch(InterruptedException e){
            e.printStackTrace();
        }

        System.out.println(
"我已經(jīng)處理完第"+(this.waiter.getNumber()+1)+"號顧客業(yè)務(wù)");
        System.out.println(
"請下一位顧客到第"+(this.id+1)+"號窗口辦理業(yè)務(wù)");
        
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;
    }

}


服務(wù)器:
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(
"銀行排隊(duì)之等待者客戶端");
        
        
final Text text = new Text(shell,SWT.MULTI);
        text.setBounds(
500100300300);
        
        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(
35053020075);
        button1.setText(
"個(gè)人業(yè)務(wù)辦理");
        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(
"您現(xiàn)在排在"+w.getNumber()+"位置上,\n您前面有"+w.getFrontnumber()+"個(gè)人\n請您耐心等候吧!哈哈");
                }

                
else{
                    text.setText(
"您前面已經(jīng)排50個(gè)人,請考慮!\n"+"您現(xiàn)在排在"+w.getNumber()+"位置上,\n您前面有"+w.getFrontnumber()+"個(gè)人\n請您耐心等候吧!哈哈");
                }

                
            }

        }
);
        Button button2 
= new Button(shell,SWT.Activate); 
        button2.setBounds(
75053020075);
        button2.setText(
"金卡個(gè)人業(yè)務(wù)辦理");
        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(
"您現(xiàn)在排在"+gw.getNumber()+"位置上,\n您前面有"+gw.getFrontnumber()+"個(gè)人\n請您等候!");
                }

                
else{
                    text.setText(
"您前面已經(jīng)排超過50人了,請考慮!\n"+"您現(xiàn)在排在"+gw.getNumber()+"位置上,\n您前面有"+gw.getFrontnumber()+"個(gè)人\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(
500100300300);
        
        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(
55053020075);
        button.setText(
"下一個(gè)用戶");
        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號窗口辦理業(yè)務(wù)");
                    }

                    
else{
                        Waiter w 
= waiterlist.poll();
                        
if(w!= null){
                            text.setText(
""+w.getNumber()+"號普通顧客請到1號窗口辦理業(yè)務(wù)");
                        }

                        
else{
                            text.setText(
"現(xiàn)在沒有人辦理業(yè)務(wù)了,您可以休息會了\n 喝杯咖啡吧,哈哈!");
                        }

                    }

                }

            }

        }
);
        shell.layout();
        shell.open();
        
while(!shell.isDisposed()){
            
if(!display.readAndDispatch()){
                display.sleep();
            }

        }

    }

}


運(yùn)行結(jié)果就是:

用戶客戶端:




銀行工作人員客戶端: