2012-05-11 6 views
6

Ho un gioco di blackjack che ho realizzato in Java e desidero segnalare l'inizio del gioco facendo clic su un pulsante. Tutti i miei ascoltatori di azioni funzionano bene e tutto il resto, ma il problema sta nel fatto che non riesco a capire come avviare il gioco senza che funzioni completamente nel metodo actionPerformed. Ovviamente, una funzione in esecuzione continua all'interno del metodo actionPerformed disattiva efficacemente il resto della GUI. Ecco un frammento di codice ....Avvia un gioco dall'interno di un listener di azioni

go.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
       // START GAME SOMEHOW but must run outside of action listener 
     } 
    }); 
+0

Cosa fa il gioco quando viene avviato? Non dovrebbe avere un ciclo. Tutte le azioni dell'utente dovrebbero essere eventi. –

+0

Penso che una buona soluzione potrebbe essere quella di non iniziare l'intero gioco, ma piuttosto di distribuire le carte e tornare. Tuttavia, vorrei sapere come avviare un programma da un listener di azioni. Immagino sia possibile, ma sono nuovo con Java e in realtà tutte queste macchine computiniche. Ogni suggerimento e 'ben accetto!!! :) –

+0

Grazie per il replay, JB. Inizialmente ho avuto l'inizializzazione di un nuovo gioco, che esegue l'intera cosa all'interno del suo costruttore, quindi il metodo actionPerformed aveva semplicemente la linea: "game g = new game()" Tuttavia, ora che si dice che dovrebbe essere un evento solo io sono tanto più sicuro che lo stavo facendo nel modo sbagliato. haha –

risposta

1

È gioco dovrebbe probabilmente iniziare nel proprio thread e gestire che si (difficile da dire), ma per farti andare si potrebbe iniziare il gioco in una nuova "esterno" filo, qualcosa di simile nel tuo actionPerformed:

public void actionPerformed(ActionEvent e) { 
    Thread thread = new Thread("Game thread") { 
     public void run() { 
      startGame(); //or however you start your game 
     } 
    }; 
    thread.start(); 
} 
+0

A meno che non si tratti di un'applicazione guidata da frame/secondo secondo/animata, direi che l'avvio di un thread separato che * esegue * il gioco sembra una cattiva idea. ActionPerfomed deve semplicemente regolare l'interfaccia utente, tornare e attendere ulteriori azioni dell'utente. – aioobe

+0

Beh, questo è quello che ho pensato che il gioco in esecuzione non stia tornando, non mi è sembrato molto guidato dagli eventi. –

7

Ovviamente, una funzione in esecuzione continua all'interno del metodo actionPerformed disabiliterà in modo efficace il resto della mia GUI.

Questa è un'osservazione valida e dimostra di aver compreso la regola fondamentale quando si lavora con Swing.

Probabilmente il gioco è guidato dagli eventi (correggimi se sbaglio), quindi l'azione eseguita dal pulsante dovrebbe semplicemente impostare il programma in un nuovo stato, in attesa di ulteriori eventi. Questo non è niente che dovrebbe richiedere molto tempo ed è tipicamente fatto direttamente dall'EDT.

Ovviamente, se si desidera eseguire un'animazione di inizio-nuovo-gioco, è necessario eseguirla in un thread separato, nel qual caso è sufficiente avviare il thread di animazione (si consiglia comunque di utilizzare SwingWorker) da all'interno del metodo actionPerformed, quindi restituire.

In codice, immagino che sarebbe simile a questa:

go.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

     // Remove the menu components 
     someJPanel.removeAll(); 

     // Show the game table 
     someJPanel.add(new GamePanel()); 

     someJPanel.revalidate(); 
     someJPanel.repaint(); 

     // done. Wait for further user actions. 
    } 
}); 
+0

Penso che questo suona assolutamente come quello che dovrei fare.Ho intenzione di implementare questo e vedere dove mi porta. Sono sorpreso di aver ricevuto così tante risposte così velocemente. Apprezzo molto l'aiuto di tutti !!! –

+1

Sì, benvenuto su StackOverflow :-) – aioobe

1

Credo che si desidera estendere javax.swing.SwingWorker.

La funzionalità di avvio non dell'interfaccia utente verrà eseguita in doInBackground e il metodo done verrà chiamato al termine dell'aggiornamento dell'interfaccia utente.

C'è anche un esempio nella descrizione della classe javadoc per aggiornare una barra di avanzamento con lo stato di ciò che sta accadendo all'avvio.

Problemi correlati