2015-09-26 11 views
5

Mam tylko 6 - 7 tygodni na naukę Java, więc z góry przepraszam, jeśli mój kod jest niechlujny lub terminologia jest wyłączona. Próbuję stworzyć program, który tworzy losową liczbę i pozwala użytkownikowi odgadnąć, dopóki nie uzyska prawidłowej liczby. Nie służy to żadnemu celowi, poza uczeniem się.Java - gra liczbowa - wiele ActionListener w tej samej klasie

Mam podstawowy program działa, chcę tylko dodać inne elementy, aby go poprawić i zdobyć doświadczenie.

Program działa w ramce JFrame i ma pole JTextField, w którym użytkownik może wprowadzić swoje domysły. Mam konfigurację ActionListener dla JTextField. Chciałbym dodać przycisk Start, który wyświetla się na początku gry. Kiedy użytkownik kliknie przycisk Start, JTextField powinien stać się aktywny. Ponadto, gdy użytkownik kliknie zgaduje poprawną odpowiedź, chciałbym użyć przycisku start, aby zresetować program. Eksperymentowałem z kilkoma sposobami, aby to zrobić bez powodzenia. Wierzę, że będzie to wymagało wielu ActionListenerów w tej samej klasie. Nie jestem nawet pewien, czy to możliwe?

Oto mój kod. Z góry dziękuję za pomoc.

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

Istnieje kilka różnych sposobów wdrożenia opcji "restartuj" w swoim programie. Czy możesz wyjaśnić, z którą częścią masz problem? –

Odpowiedz

5

Oczywiście można mieć wielu słuchaczy działania. W rzeczywistości twoja klasa nie powinna go zaimplementować.

start poprzez usunięcie metody actionPerformed, i zastąpić ten wiersz:

numberField.addActionListener(this); 

z tym:

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

można dodać kolejną słuchacza działania przycisku startowego planujesz aby dodać, zgodnie z tym wzorcem, używając anonimowej klasy. (To nie musi być anonimowa klasa, było to po prostu łatwe do udowodnienia.)

+0

Dzięki za pomoc! – Brent

4

Jak powiedział janos, dodanie detektora akcji do każdego przycisku dobrze działa, ale w dużym kodzie, gdy trzeba dodać wiele przycisków nie wygląda zbyt schludny, proponuję pomocą setActionCommand() dla JButton s, które tworzysz, użycie jest proste, można wdrożyć ActionListener do JFrame jak ty, ale po każdym przyciskiem dodać

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

Możesz zrobić to tak samo, jak chcesz, teraz, aby prawidłowo wykonać te polecenia Funkcja powinna wyglądać następująco:

@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; 
    } 
} 

I tak dalej, znowu inne rozwiązanie działa perfekcyjnie, po prostu osobiście uważam, że ten jeden jest dużo neater zwłaszcza w kodzie gdzie masz wielu słuchaczy działania.

+0

Uwielbiam to rozwiązanie. To takie proste, nawet nowicjusz taki jak ja może go śledzić. Dzięki! – Brent

+0

Chciałbym nawet zmienić wszystkie te instrukcje 'if' z' switch-case'. – Frakcool

Powiązane problemy