2013-06-05 4 views
0

Когда я вводил что-то в текстовое поле, мое приложение зависает и перестает отвечать, если я нахожусь в enter. Это игра, в которой вы пытаетесь получить число от 1 до 100. Мне кажется, мне нужна кнопка отправки или ActionListener на клавише ввода. Может ли кто-нибудь помочь мне в этом. Также есть способ разбить линии в FlowLayout? Или другой макет лучше? Вот мой код:Кнопки отправки Java Actionlistener

import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 


public class game extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private Random rand = new Random(); 
    private int number = rand.nextInt(101); 
    private JLabel result, prompt; 
    private JTextField input; 


    game() { 
     super("Numbers"); 
     setSize(500, 500); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new FlowLayout()); 

     prompt = new JLabel("Enter a number between 1 and 100"); 
     add(prompt); 

     input = new JTextField(3); 
     add(input); 

     result = new JLabel(""); 
     add(result); 



     event a = new event(); 
     input.addActionListener(a); 

    } 

    public class event implements ActionListener { 
     public void actionPerformed(ActionEvent a) { 
      int guess = 0; 

      try { 
       guess = Integer.parseInt(input.getText()); 
      } catch(NumberFormatException e) { 
       result.setText("Error - Illegal Data Entered"); 
       result.setForeground(Color.RED); 
      } 


      while(guess!=number) { 
       if(guess>number) { 
        result.setText("Guess Too High. Try Again."); 
        result.setForeground(Color.CYAN); 
       } else if(guess<number) { 
        result.setText("Guess Too Low. Try Again."); 
        result.setForeground(Color.CYAN); 
       } else { 
        result.setText("Unknown Error"); 
        result.setForeground(Color.RED); 
       } 
      } 
      if(guess==number){ 
       result.setText("Right the number was "+number); 
       result.setForeground(Color.GREEN); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     new game().setVisible(true); 

    } 

} 

Заранее спасибо.

Update

Так я извлекал While-цикл и все работало нормально. Правильно ли это делалось?

ответ

1

Ваша проблема здесь, guess или number никогда не изменяет значение, бесконечный цикл

while(guess!=number) { 
        if(guess>number) { 
         result.setText("Guess Too High. Try Again."); 
         result.setForeground(Color.CYAN); 
        } else if(guess<number) { 
         result.setText("Guess Too Low. Try Again."); 
         result.setForeground(Color.CYAN); 
        } else { 
         result.setText("Unknown Error"); 
         result.setForeground(Color.RED); 
        } 
       } 

У вас есть только удалить время, является unnecesary

Так ур внутренний класс был бы как этот

public class MyEvent implements ActionListener { 
     public void actionPerformed(ActionEvent a) { 
      int guess = 0; 

      try { 

       guess = Integer.parseInt(input.getText()); 
         if(guess>number) { 
          result.setText("Guess Too High. Try Again."); 
          result.setForeground(Color.CYAN); 
         } else if(guess<number) { 
          result.setText("Guess Too Low. Try Again."); 
          result.setForeground(Color.CYAN); 
         } else { 
          result.setText("Right the number was "+number); 
          result.setForeground(Color.GREEN);      
         } 

      }catch(NumberFormatException nfe){ 
       result.setText("Error - Illegal Data Entered"); 
       result.setForeground(Color.RED);    
      } 

    } 
} 

я стараюсь поймать все блоки причины, когда это число не может и есть до конца ур выполнения события ..

Примечания Следуйте конвенции, положить декларативных имена и классы должны начинаться с UpperCase

+0

Итак, если я добавлю 'if (guess == number) {break;}' это исправить? – Col1107

+0

Спасибо, что имеет смысл – Col1107

+0

смотреть, у вас есть еще одна потенциальная ошибка с попыткой и уловкой, если вы вставляете выполнение строки, и вы не закончите выполнение кода ур-кода при улове, поэтому я положил его в конец блока. – nachokk

1

Вы блокирование события диспетчерские темы с while-loop, который никогда не может пчелиные сломан ...

while(guess!=number) {...} 

Обновлено ...

Вместо того, чтобы ...

while(guess!=number) { 
    if(guess>number) { 
     result.setText("Guess Too High. Try Again."); 
     result.setForeground(Color.CYAN); 
    } else if(guess<number) { 
     result.setText("Guess Too Low. Try Again."); 
     result.setForeground(Color.CYAN); 
    } else { 
     result.setText("Unknown Error"); 
     result.setForeground(Color.RED); 
    } 
} 

Пробег

if(guess>number) { 
    result.setText("Guess Too High. Try Again."); 
    result.setForeground(Color.CYAN); 
} else if(guess<number) { 
    result.setText("Guess Too Low. Try Again."); 
    result.setForeground(Color.CYAN); 
} else { 
    result.setText("Unknown Error"); 
    result.setForeground(Color.RED); 
} 

Свинг - это среда, управляемая событиями. То есть вы программа будет ждать (автоматически) до тех пор, пока пользователь не делает что-то и ваша программа будет реагировать на это

+0

Извините, я все еще не очень хорошо разбираюсь в Java, как бы исправить это? – Col1107

+0

Ну, это зависит от того, чего вы хотите достичь. Начните с того, что избавитесь от него (но сохраните код внутри него) и посмотрите, что получится – MadProgrammer

0

У вас есть бесконечный цикл. guess никогда не обновляется в теле вашей конструкции цикла, поэтому условие всегда будет ложным при каждом повторе.

+0

Так что я должен добавить 'break' – Col1107