2015-09-26 14 views
5

Sono solo 6 - 7 settimane nell'apprendimento di Java, quindi mi scuso in anticipo se il mio codice è scadente o la terminologia è disattivata. Sto cercando di creare un programma che crea un numero casuale e consente all'utente di indovinare fino a quando non ottengono il numero corretto. Non ha altro scopo se non un'esperienza di apprendimento per me.Java - Number Game - Multiple ActionListener nella stessa classe

Ho il programma di base in funzione, voglio solo aggiungere altri elementi per migliorarlo e ottenere l'esperienza.

Il programma viene eseguito in una JFrame e dispone di un campo JText per consentire all'utente di immettere le proprie ipotesi. Ho l'installazione di ActionListener per JTextField. Mi piacerebbe aggiungere un pulsante Start che viene visualizzato all'inizio del gioco. Quando l'utente fa clic sul pulsante di avvio, il JTextField dovrebbe diventare attivo. Inoltre, quando l'utente fa clic sulla risposta corretta, mi piacerebbe utilizzare il pulsante di avvio per ripristinare il programma. Ho sperimentato diversi modi per farlo senza successo. Credo che questo richiederà più ActionListeners nella stessa classe. Non sono nemmeno sicuro che sia possibile?

Ecco il mio codice. Grazie in anticipo per qualsiasi aiuto.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

public class JMyFrame2 extends JFrame implements ActionListener { 
    Random num = new Random(); 
    int computerGenerated = num.nextInt(1000); 
    public int userSelection; 
    JTextField numberField = new JTextField(10); 
    JLabel label1 = new JLabel(); 
    Container con = getContentPane(); 
    int previousGuess; 

    // constructor for JMyFrame 
    public JMyFrame2(String title) { 
     super(title); 
     setSize(750, 200); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     label1 = new JLabel(
       "I have a number between 1 and 1000 can you guess my number?" + "Please enter a number for your first guess and then hit Enter."); 

     setLayout(new FlowLayout()); 
     add(numberField); 
     add(label1); 
     System.out.println(computerGenerated); 

     numberField.addActionListener(this); 
    } 


    public void actionPerformed(ActionEvent e) { 
     userSelection = Integer.parseInt(numberField.getText()); 
     con.setBackground(Color.red); 

     if (userSelection == computerGenerated) { 
      label1.setText("You are correct"); 
      con.setBackground(Color.GREEN); 
     } else if (userSelection > computerGenerated) { 
      label1.setText("You are too high"); 
     } else if (userSelection < computerGenerated) { 
      label1.setText("You are too low"); 
     } 
    } 
} 


public class JavaProgram5 { 

    public static void main(String[] args) { 


     JMyFrame2 frame2 = new JMyFrame2("Assignment 5 - Number Guessing Game"); 
     frame2.setVisible(true); 
    } 
} 
+0

Esistono diversi modi per implementare un'opzione "riavvia" nel programma. Potresti spiegare in quale parte hai esattamente problemi con? –

risposta

5

Certo, puoi avere più ascoltatori di azioni. In effetti, la tua classe non dovrebbe implementarla.

Inizia rimuovendo il metodo actionPerformed, e sostituire questa linea:

numberField.addActionListener(this); 

Con questo:

numberField.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      userSelection = Integer.parseInt(numberField.getText()); 
      con.setBackground(Color.red); 

      if (userSelection == computerGenerated) { 
       label1.setText("You are correct"); 
       con.setBackground(Color.GREEN); 
      } else if (userSelection > computerGenerated) { 
       label1.setText("You are too high"); 
      } else if (userSelection < computerGenerated) { 
       label1.setText("You are too low"); 
      } 
     } 
    }); 

È possibile aggiungere un altro listener di azione al pulsante di avvio si prevede per aggiungere, seguendo questo modello, usando una classe anonima. (Non deve essere una classe anonima, questo era solo semplice da dimostrare.)

+0

Grazie per l'aiuto! – Brent

4

Come disse Janos, l'aggiunta di un listener di azioni a ciascun pulsante fa il lavoro bene, ma nel codice di grandi dimensioni in cui è necessario aggiungere un sacco di pulsanti non sembra troppo pulito, vi consiglio di utilizzare il setActionCommand() per le JButton s che si sta creando, l'utilizzo è semplice, si implementa ActionListener al JFrame come avete fatto, ma dopo ogni pulsante aggiungi

button.addActionListener(this); 
button.setActionCommand("commandname") 

E puoi farlo per tutti i pulsanti che desideri, ora per attivare correttamente questi comandi l'azione eseguita funzione dovrebbe assomigliare a questo:

@Override 
public void actionPerformed (ActionEvent e) { 
String cmd = e.getActionCommand(); 
switch(cmd) { 
    case "action1": 
     // Do something 
     break; 
    case "action2": 
     // Do something else 
     break; 
    case "potato": 
     // Give Mr. chips a high five 
     break; 
    default: 
     // Handle other cases 
     break; 
    } 
} 

E così via, di nuovo l'altra soluzione funziona perfettamente bene, ho appena personalmente penso che questo è molto più ordinato soprattutto in un codice in cui si dispone di più action listener.

+0

Amo questa soluzione. È così semplice, anche un principiante come me può seguirlo. Grazie! – Brent

+0

Cambiare anche tutte le istruzioni 'if' con un' switch-case'. – Frakcool

Problemi correlati