2016-05-18 6 views
1

Ich mache eine Aufgabe auf Java Swing und ich mache ein GUI Guessing Game-Programm. Meine Frage ist, wenn ich den "rate" Knopf drücke passiert nichts, ich kann es nicht schließen indem ich auf X klicke Ich muss es mit Eclipse beenden. Was habe ich falsch gemacht? Korrigiert der GuessHandler den ActionListener oder habe ich etwas falsch gemacht?Kann Java Swing GUI Guessing Spiel nicht zur Arbeit

public class GuessingGameGui extends JFrame 
{ 
    public static final int WIDTH = 600; 
    public static final int HEIGHT = 400; 
    private JTextField theText; 
    private JLabel message; 
    private JPanel p1; 
    private JPanel p2; 
    private int guess; 
    private int numberOfTries = 0; 

    public GuessingGameGui() 
    { 
     super(); 
     setSize(WIDTH, HEIGHT); 
     //set the window title to "Guessing Game" 
     setTitle("Guessing Game"); 
     Container c = getContentPane(); 
     c.setLayout(new BorderLayout()); 
     c.setBackground(Color.WHITE); 

     p1 = new JPanel(); 
     p2 = new JPanel(); 

     p1.setBackground(Color.WHITE); 
     p2.setBackground(Color.BLUE); 

     //"add a JButton called "Guess" 
     JButton guessButton = new JButton("Guess"); 
     GuessHandler ghandler = new GuessHandler(); 
     guessButton.addActionListener(ghandler); 
     p1.add(guessButton); 

     //The north panel will have a JLabel with the text "Guess a number between 1 and 10?" 
     JLabel label1 = new JLabel("Guess a number between 1 and 10?"); 
     c.add(label1, BorderLayout.NORTH); 

     //The south panel will have a JLabel for displaying if the user guessed correctly or not 
     message = new JLabel(""); 
     p2.add(message, BorderLayout.SOUTH); 
     c.add(p2, BorderLayout.SOUTH); 


     JPanel textPanel = new JPanel(); 
     textPanel.setBackground(Color.LIGHT_GRAY); 

     //In the center panel, add a JTextField where the user can enter a number to guess 
     theText = new JTextField(10); 
     theText.setBackground(Color.WHITE); 
     textPanel.add(theText); 
     textPanel.add(p1); 
     c.add(textPanel, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) 
    { 
     GuessingGameGui guessGame = new GuessingGameGui(); 
     guessGame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     guessGame.setSize(WIDTH, HEIGHT); 
     guessGame.setVisible(true); 
    } 

    class GuessHandler implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      int numberToGuess = (int) (Math.random() * 10 + 1); 
      Scanner input = new Scanner (System.in); 
      boolean win = false; 
      while (win == false){ 

       guess = input.nextInt(); 
       numberOfTries++; 
       if (guess < 1 || guess > 10) 
       { 
        //Make the south panel background color RED if they entered an invalid number (not between 1 and 10) 
        p2.setBackground(Color.RED); 
       } 
       else if (guess == numberToGuess) 
       { 
        win = true; 
        //Make the south panel background color YELLOW if they guessed right 
        p2.setBackground(Color.YELLOW); 
        //and display "YOU GOT IT (n attempts)", where n is the number of attempts the user guessed 
        message.setText("YOU GOT IT (" +numberOfTries + "attempts)"); 
       } 
       else 
       { 
        //Make the south panel background color GREY if they guessed wrong 
        p2.setBackground(Color.GRAY); 
        //display "Sorry try again" 
        message.setText("Sorry try again"); 
       } 
      } 
     } 
    } 
} 
+0

Da Ihr Programm gesperrt ist, denke ich, dass Sie in Ihrem Actionhandler eine Endlosschleife haben, so dass win niemals auf true gesetzt wird . Außerdem erhalten Sie Eingaben von der Konsole nicht von dem gewünschten JTextfield –

Antwort

3

Es gibt mehrere Probleme in Ihrem Programm, das Ihr Problem verursachen:

  1. Sie sollten keine while Schleife in Ihrer Methode actionPerformed haben, weil sonst Ihre Swing-Anwendung einfrieren.
  2. Sie benötigen keine Scanner als die Rate ist der Wert aus Ihrem Textfeld so zu extrahieren, dass guess = input.nextInt() sollte guess = Integer.parseInt(theText.getText()) sein. In der Tat wird Ihre Anwendung so lange einfrieren, bis eine integer in der standard input stream zur Verfügung gestellt wird, was hier nicht erwartet wird.
+0

Das ist genau das. Beide Punkte beenden Ihre Anwendung: Die while-Schleife wird unbegrenzt weiterlaufen, ohne jemals auf neue Eingaben reagieren zu können. Und der Scanner wird einfach für immer auf die Eingabe der Konsole warten. –

0

Es kann sinnvoll sein, diese an den Rahmen immer hinzufügen:

frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
frame.addWindowListener(new WindowAdapter() { 
    @Override 
    public void windowClosing(final WindowEvent e) { 
     handleExitRequest(); 
    } 
}); 

und dann ein Verfahren handleExitRequest() erstellen die tatsächliche Nähe zu tun (vielleicht nur anrufen System.exit (0);) Sie rufen diese Methode auch über actionPerformed() eines "Exit" -Menüs auf, wenn Sie einen solchen haben. Dadurch können Sie alles bereinigen, was vor dem Beenden getan werden sollte (z. B. Festschreiben oder Rollback von Datenbankoperationen usw.)