2010-02-23 50 views
3

我正在創建一個Blackjack Card遊戲模擬器。我是SCJP,熟悉核心Java概念。我對Java swing和awt有一個非常基本的理解。 已經完成了編寫基本遊戲邏輯的CLI邏輯。我的設計包括幾個類,如 經銷商,播放器,表,卡,賭場和其他一些.. 卡和套件的枚舉。如何使用Java Swing和MVC開發真正的GUI開發

我已經閱讀了關於MVC作爲理論概念,熟悉名稱'設計模式'(不知道它們是如何實現的)任何我建議學習的時候寫一些真正的代碼。所以我開始與這...

我現在卡住了,我應該如何去了解我的項目編寫代碼?編寫GUI代碼並將其組織到已存在的代碼中。

+0

我沒有理解爲MVC是如何在Java中實現。 :( – 2010-02-23 18:28:55

+0

MVC不需要用你正在編程的語言來實現。唯一的要求是鬆散的概念分離,即模型,視圖和控制器。你不應該擴展模型或視圖或控制器,或者至少,把模型和視圖放在單獨的包中 – 2010-02-23 18:32:54

回答

2

我花了好長時間才學會MVC(我被教它不正確的事情在大學,另外很多在當時在線資源錯了吧)。無論如何,你需要做的核心是在模型中沒有任何視圖信息(即玩家在屏幕上看起來像什麼,幀緩衝區,模型的多邊形)。相反,您可以在單獨的名稱空間中創建視圖和模型,然後使用事件將它們連接在一起。有時在模型中發生時,會通知視圖,並對視圖進行更改。此外,當按下鼠標或按下某個鍵時,輸入事件將轉換爲另一個面向模型的事件,該事件可以採用方法調用的形式進入模型。然後將模型中的任何更改反饋到視圖上。

記住這一點:型號應該是功能不認爲被連接,並在執行(除了在控制檯或許調試信息)不應該在屏幕上顯示任何東西。

+0

在哪個類中我應該放置我的Gui代碼?有這麼多的類別..處理事件的地方?如何決定? – 2010-02-23 18:36:24

+0

作爲示例對於二十一點: BlackJack(模型)和BlackJackApp(視圖)。您可以使用notify/listener模式將BlackJackApp附加到模型(可能會調用JFrame或其他東西),並在模型更改時通知視圖(創建一個大的偵聽器在視圖中的任何標準操作都只是調用模型中的方法,即Card [] getCards(Player p),showHand(Player p),w ith像onShowHand(播放器p)這樣的事件通過偵聽器通知視圖。您可能需要在推進遊戲的模型中使用next()方法 – 2010-02-23 19:45:47

1

下面是如何可以這樣拆分一個簡單的例子。

據推測,玩家的卡被表示爲「手」或類似的物體(即卡的集合)。這是你的模型。所以,讓我們打電話給你的模型:

package casino.blackjack.model; 
class DealtCards 
{..} 

您可能使用一個JPanel或一些其他Swing結構顯示你的卡。所以,你可以把那個真正做到每張卡的呈現在一個單獨的包中的所有對象:

package casino.blackjack.view; 
class DealtCardsView 
{..} 

的DealtCards對象獨立於它是如何顯示的存在,但如果用戶沒有對某事的狀態可以改變GUI。例如,要求'打'。據推測,可能有一個按鈕來做到這一點。該視圖源自您的模型。

package casino.blackjack.view; 
class DealtCardsView 
{ 
    JButton hitMeButton = new JButton("HIT"); 
    DealtCards cards; 

    public DealtCardsView(DealCards myCards) 
    { 
    cards = myCards; 
    renderCards(); 
    } 

    private void renderCards(){.. do something..} 

} 

現在,如果玩家決定點擊,他的DealtCards對象會改變。所以,我們想要實現模型更新的方式。你可以使用控制器類來做到這一點。控制器類實現了ActionListener接口。當執行動作時(即用戶點擊「點擊」按鈕),控制器更新模型。所以視圖不能直接更新模型。它只是發送一個'行動'發生的通知。然後,任何感興趣的各方,在這種情況下,我們的控制者都可以採取適當的行動

package casino.blackjack.controller; 
class DealtCardsController implements ActionListener 
{ 
    DealtCards cards; 
    DealtCardsView cardView; 
    public DealtCardsController(DealtCards myHand, DealtCardsView myView) 
    { 
    cards = myHand; 
    cardView = myView; 
    cardView.hitMeButton.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
    cards.changed(); 
    } 
} 

所以你在三層分割你的應用程序。您的模型只包含當前狀態(或當前數據)以及任何驗證。您的視圖類以適當的方式呈現模型。視圖上的任何用戶交互都由控制器處理,其責任是更新模型。
這樣,如果你想改變你的視圖(比如說使用一個applet而不是一個窗口),你的模型並不在意。
不好意思,囉嗦的回答,但希望有所幫助!

編輯:一個好的MVC解釋一下:java/gwt UI coding - clean code