malocchio
03-11-2009, 02:16
Ho scritto a scopo didattico un'applicazione desktop per il tris, human vs. cpu :D.
Ho fatto un disegno classi che definisco decente, forse troppo elaborato, ma a scopo didattico.
In sintesi, così formata:
alcune enum
public enum Player {
HUMAN("X"),
CPU("O"),
NONE(" ");
Player(String s) {
this.s = s;
}
private String s;
@Override
public String toString() {
return s;
}
}
public enum TrisState {
HUMAN_WON("Human player won!"),
CPU_WON("Cpu player won!"),
DRAW("Draw!"),
INCOMLETE("Your turn...");
TrisState (String label) {
this.label = label;
}
private String label;
@Override
public String toString() {
return this.label;
}
}
Un modello che rappresenta la griglia, che gestisce l'inserimento dei simboli, il controllo sui turni, l'update dell'interfaccia grafica, il controllo dei possibili risultati raggiunti (vinto, pari, continua...) e, guardacaso, la notifica tramite eventi di eventuali ascoltatori (su cui baserò le prossime classi da scrivere). In sintesi:public class TrisGridModel extends AbstractTableModel {
private Player[][] grid;
public TrisGridModel() {...}
public TrisGridModel(Player[][] grid) {...}
public int getRowCount() {...}
public int getColumnCount() {...}
public Player getValueAt(int r, int c) {...}
@Override
public void setValueAt(Object aValue, int r, int c) {...}
public TrisState getState() {...}
public boolean complete() {...}
public Player tris() {...}
private void switchNow() {...}
//Ecco la gestione degli eventi
private List<TrisGameListener> listeners;
{
this.listeners = new ArrayList<TrisGameListener>();
}
public void addTrisGameListener (TrisGameListener tgl) {...}
public boolean removeTrisGameListener (TrisGameListener tgl) {...}
private void fireTrisGameEvent (TrisGameEvent tge) {
//TODO notifica dell'evento
...
}
}
Questa è l'interfaccia TrisGameListener, che è scritta così ma potrà prevedere altri tipi di eventi.
public interface TrisGameListener extends java.util.EventListener {
public void movePerformed (TrisGameEvent tge);
public void stateChanged (TrisGameEvent tge);
}
I miei dubbi:
vorrei progettare una gestione degli eventi in perfetto stile Swing, con eventi, ascoltatori e oggetti che generano eventi. Però non ho capito bene come si deve definire la classe che descrive un evento. Nel caso sopra (TrisGameListener) ci sono due possibili tipi di evento:
- un giocatore inserisce un simbolo (movePerformed(...))
- la griglia cambia di stato (vedi TrisGameState) (stateChanged(...))
Cosa devo scrivere nella classe TrisGameEvent? I metodi dell'ascoltatore che parametri devono prendere in ingresso?
L'interfaccia grafica comunica con la griglia (TrisGameModel) tramite gli eventi caratteristici della classe TableModel, infatti, nella classe della gui:
public class TrisPanel extends JPanel {
private JButton[][] grid;
private TrisGridModel model;
public TrisPanel () {...}
public TrisPanel(TrisGridModel model) {
this.model = model;
this.model.addTableModelListener( new TrisModelListener() );
...
}
public class TrisModelListener implements TableModelListener {
public void tableChanged(TableModelEvent e) {...}
}
}
Vorrei aggiungere anche la funzionalità "Hai vinto!" o "Hai perso!" o "Pari" proprio tramite eventi TrisGameEvent.
Altro dubbio: se ho un oggetto Swing con alcuni ascoltatori registrati ad esso, una volta che genera un evento e attiva i metodi degli ascoltatori, qual'è il thread in esecuzione? Posso agire su oggetti Swing direttamente oppure devo usare l'invokeLater() ??
Ho fatto un disegno classi che definisco decente, forse troppo elaborato, ma a scopo didattico.
In sintesi, così formata:
alcune enum
public enum Player {
HUMAN("X"),
CPU("O"),
NONE(" ");
Player(String s) {
this.s = s;
}
private String s;
@Override
public String toString() {
return s;
}
}
public enum TrisState {
HUMAN_WON("Human player won!"),
CPU_WON("Cpu player won!"),
DRAW("Draw!"),
INCOMLETE("Your turn...");
TrisState (String label) {
this.label = label;
}
private String label;
@Override
public String toString() {
return this.label;
}
}
Un modello che rappresenta la griglia, che gestisce l'inserimento dei simboli, il controllo sui turni, l'update dell'interfaccia grafica, il controllo dei possibili risultati raggiunti (vinto, pari, continua...) e, guardacaso, la notifica tramite eventi di eventuali ascoltatori (su cui baserò le prossime classi da scrivere). In sintesi:public class TrisGridModel extends AbstractTableModel {
private Player[][] grid;
public TrisGridModel() {...}
public TrisGridModel(Player[][] grid) {...}
public int getRowCount() {...}
public int getColumnCount() {...}
public Player getValueAt(int r, int c) {...}
@Override
public void setValueAt(Object aValue, int r, int c) {...}
public TrisState getState() {...}
public boolean complete() {...}
public Player tris() {...}
private void switchNow() {...}
//Ecco la gestione degli eventi
private List<TrisGameListener> listeners;
{
this.listeners = new ArrayList<TrisGameListener>();
}
public void addTrisGameListener (TrisGameListener tgl) {...}
public boolean removeTrisGameListener (TrisGameListener tgl) {...}
private void fireTrisGameEvent (TrisGameEvent tge) {
//TODO notifica dell'evento
...
}
}
Questa è l'interfaccia TrisGameListener, che è scritta così ma potrà prevedere altri tipi di eventi.
public interface TrisGameListener extends java.util.EventListener {
public void movePerformed (TrisGameEvent tge);
public void stateChanged (TrisGameEvent tge);
}
I miei dubbi:
vorrei progettare una gestione degli eventi in perfetto stile Swing, con eventi, ascoltatori e oggetti che generano eventi. Però non ho capito bene come si deve definire la classe che descrive un evento. Nel caso sopra (TrisGameListener) ci sono due possibili tipi di evento:
- un giocatore inserisce un simbolo (movePerformed(...))
- la griglia cambia di stato (vedi TrisGameState) (stateChanged(...))
Cosa devo scrivere nella classe TrisGameEvent? I metodi dell'ascoltatore che parametri devono prendere in ingresso?
L'interfaccia grafica comunica con la griglia (TrisGameModel) tramite gli eventi caratteristici della classe TableModel, infatti, nella classe della gui:
public class TrisPanel extends JPanel {
private JButton[][] grid;
private TrisGridModel model;
public TrisPanel () {...}
public TrisPanel(TrisGridModel model) {
this.model = model;
this.model.addTableModelListener( new TrisModelListener() );
...
}
public class TrisModelListener implements TableModelListener {
public void tableChanged(TableModelEvent e) {...}
}
}
Vorrei aggiungere anche la funzionalità "Hai vinto!" o "Hai perso!" o "Pari" proprio tramite eventi TrisGameEvent.
Altro dubbio: se ho un oggetto Swing con alcuni ascoltatori registrati ad esso, una volta che genera un evento e attiva i metodi degli ascoltatori, qual'è il thread in esecuzione? Posso agire su oggetti Swing direttamente oppure devo usare l'invokeLater() ??