Come fare con lo sviluppo GUI reale con Java Swing e MVC


Sto creando un emulatore di gioco di carte Blackjack. Sono un SCJP, familiarità con i concetti Java di base. Ho una conoscenza di base di Java swings e awt. Già finito di scrivere la logica di gioco di base, una logica CLI. Il mio design include diverse classi come, Commerciante,Giocatore,Tavolo,Carta, Casinò e alcuni altri.. Enum per le carte e suite.

Ho letto di MVC come un concetto teorico, familiarità con il nome 'design patters' (nessuna comprensione di come vengono implementati) Ovunque mi viene suggerito di imparare mentre scrivo qualcosa di reale code.So Ho iniziato con questo...

Sono bloccato ora, come dovrei scrivere codice per il mio progetto?? Scrivere il codice GUI e organizzarlo all'interno del codice già esistente.

Author: Jonas, 2010-02-23

2 answers

Mi ci sono voluti anni per imparare MVC (mi sono state insegnate cose errate a riguardo all'università, e inoltre molte fonti online all'epoca si sbagliavano). Ad ogni modo, il nucleo di ciò che devi fare è non avere alcuna informazione di visualizzazione nel tuo modello (cioè, come appare il lettore sullo schermo, il framebuffer, i poligoni dei tuoi modelli). Invece, si creano la vista e il modello in spazi dei nomi separati e quindi si utilizzano gli eventi per collegare i due insieme. Quando a volte accade nel vostro modello, il la vista viene notificata e vengono apportate modifiche alla vista. Inoltre, quando si preme il mouse o si preme un tasto, l'evento di input viene trasformato in un altro evento orientato al modello che può assumere la forma di una chiamata al metodo nel modello. Eventuali modifiche nel modello vengono quindi reinserite nella vista.

Ricorda questo: il modello dovrebbe essere funzionale senza che la vista sia collegata e non dovrebbe mostrare nulla sullo schermo durante l'esecuzione (tranne forse le informazioni di debug nella console).

 2
Author: Chris Dennett, 2010-02-23 18:25:18

Ecco un semplice esempio di come questo potrebbe essere diviso.

Presumibilmente, le carte di un giocatore sono rappresentate come una 'mano' o un oggetto simile (cioè una collezione di carte). Questo è il tuo modello. Quindi chiamiamo il tuo modello:

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

Visualizzi le tue carte usando forse un JPanel o qualche altro costrutto Swing. Quindi potresti mettere tutti gli oggetti che effettivamente fanno il rendering di ogni carta in un pacchetto separato:

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

L'oggetto DealtCards esiste indipendentemente da come è visualizzato, ma il suo stato potrebbe cambiare se un utente fa qualcosa sulla GUI. Ad esempio, chiedendo di essere "colpito". Presumibilmente, potrebbe esserci un pulsante per farlo. La vista è derivata dal tuo modello.

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..}

}

Ora, se un giocatore decide di colpire, il suo oggetto DealtCards cambia. Quindi, vogliamo implementare un modo in cui il tuo modello viene aggiornato. Puoi farlo usando una classe controller. La classe controller implementa l'interfaccia ActionListener. Quando viene eseguita un'azione (ad esempio, l'utente fa clic su " hit" pulsante), il controller aggiorna il modello. Quindi la vista non può aggiornare direttamente il modello. Invia semplicemente una notifica che si è verificata un'azione. Eventuali soggetti interessati, in questo caso il nostro titolare, potranno quindi prendere le opportune misure.

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();
  }
}

Quindi dividi l'applicazione in tre livelli. Il tuo modello contiene solo lo stato corrente (o i dati correnti) e qualsiasi convalida che lo circonda. Le classi di visualizzazione rendono il modello in modo appropriato. Qualsiasi interazione dell'utente, sul view, è gestito dal controller, la cui responsabilità è quindi quella di aggiornare il modello.
In questo modo, se vuoi cambiare la tua vista, (ad esempio usa un'applet invece di una finestra) al tuo modello non importa.
Scusa per la risposta prolissa, ma spero che aiuti un po'!

EDIT: Una bella spiegazione MVC qui: java / gwt UI coding-clean code

 1
Author: Luhar, 2017-05-23 10:27:34