2010-08-05 4 views
1

Я пытаюсь написать программу на Java, которая принимает случайное число от 1 до 1000, а затем, как предполагается, цвет фона меняется на синий (холодный) или красный (теплый), если они находятся в числе , Я новичок в java GUI, но я думаю, что остальная часть логики правильная, а не уверенная. Он компилируется, но кнопка угадывания не работает. Любые указания будут оценены.Java guessing game

package guessGame; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.color.*; 
import java.util.Random; 


import java.util.Random; 
import java.util.logging.FileHandler; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class GuessGame extends JFrame 
{ 
    private JFrame mainFrame; 
    private JButton GuessButton; 
    private JButton QuitButton; 
    private JLabel prompt1, prompt2; 
    private JTextField userInput; 
    private JLabel comment = new JLabel("What is your destiny?"); 
    private JLabel comment2 = new JLabel (" "); 
    //private int number, guessCount; 
    //private int lastGuess; 
    private int randomNumber; 
    private Color background; 


    public GuessGame() 
    { 
     mainFrame = new JFrame ("Guessing Game!"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //Creates components 
     GuessButton = new JButton("Guess"); 
     QuitButton = new JButton("Quit"); 
     prompt1 = new JLabel("I have a number between 1 and 1000."); 
     prompt2 = new JLabel("Can you guess my number? Enter your Guess:"); 
     comment = new JLabel ("What is your destiny?"); 
     comment2 = new JLabel (" "); 
     userInput = new JTextField(5); 
     //userInput.addActionListener(new GuessHandler()); 

     //content pane 
     Container c = mainFrame.getContentPane(); 
     c.setLayout(new FlowLayout()); 

     //adding component to the pane 
     c.add(prompt1); 
     c.add(prompt2); 
     c.add(userInput); 
     c.add(comment2); 
     c.add(GuessButton); 
     c.add(QuitButton); 
     c.add(comment); 

     GuessButton.setMnemonic('G'); 
     QuitButton.setMnemonic('Q'); 

     mainFrame.setSize(300,200); 
     mainFrame.setLocationRelativeTo(null); 
     mainFrame.setVisible(true); 
     mainFrame.setResizable(false); 

     // define and register window event handler 
    // mainFrame.addWindowListener(new WindowAdapter() { 
    //  public void windowClosing(WindowEvent e) 
    //  { System.exit(0); } 
    // }); 

     //creating the handler 
     GuessButtonHandler ghandler = new GuessButtonHandler(); //instantiate new object 
     GuessButton.addActionListener(ghandler); // add event listener 

     QuitButtonHandler qhandler = new QuitButtonHandler(); 
     QuitButton.addActionListener(qhandler); 



    } 

    public void paint (Graphics g) 
    { 
     super.paint(g); 
     setBackground(background); 
    } 

    class QuitButtonHandler implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      System.exit(0); 
     } 
    } 

    class GuessButtonHandler implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      int getUserInput=0; 
      int diff; 
      int Difference; 
      randomNumber = new Random().nextInt(1001); 
      try { 
       getUserInput = Integer.parseInt(
         userInput.getText().trim()); 
      } catch (NumberFormatException ex){ 
       comment.setText("Enter a VALID number!"); 
       return; 
      } 
      if (getUserInput == randomNumber){ 
       JOptionPane.showMessageDialog(null, "CONGRATULATIONS! You got it!!", 
         "Random Number: " + randomNumber, 
         JOptionPane.INFORMATION_MESSAGE); 
       randomNumber = new Random().nextInt(1000) + 1; 
       return; 
      } 
      if (getUserInput > randomNumber){ 
       comment.setText("Too High. Try a lower number."); 
       diff=getUserInput - randomNumber; 
       Difference=Math.abs(diff); 
      } else { 
       comment.setText("Too Low. Try a higher number."); 
       diff=randomNumber - getUserInput; 
       Difference=Math.abs(diff); 
      } 

      if(Difference<=25){ 
       comment2.setText("Cold"); 
       setBackgroundColor(Color.blue); 
      } 

      if(Difference<=10){ 
       comment2.setText("Warm"); 
       setBackgroundColor(Color.red); 
      } 

      else { 
      } 
     } 
     private void setBackgroundColor(Color color) { 
       setBackgroundColor(color); 
      } 
    } 


    public static void main(String args[]) { 
     //instantiate gueesgame object 
     GuessGame app = new GuessGame(); 

    } 
} 
+0

почему бы вам не попробовать сокращения кода наименьшей возможной версии, которая показывает отказ, а не сбрасывать программу на сообщество и говоря «исправить» – Jherico

+1

вы не» t нужно вызвать 'setBackground (color);' 3 раза –

ответ

1

У вас есть больше компонентов Swing, чем вам нужно, и вы, кажется, добавляете один набор в кадр, манипулируя другим набором. Например, у вас есть два JTextField s, fieldBox и userInput. Вы добавляете userInput к кадру, но отметьте fieldBox для ввода в обработчике кнопки Guess. Так как fieldBox всегда пуст, то улавливается вашим обработчиком исключений (который должен действительно просто поймать , а не Exception), а comment обновлен с помощью «Введите номер VALID!». Однако, так же как и с областью двойного текста, comment не на самом деле добавить к кадру, prompt1 и prompt2 являются, так что вы не можете видеть изменение

+0

Итак, я исправил часть комментария, и он работает и показывает сейчас, и я изменил его на numberFormatException, но я немного смущен, что вы имеете в виду и что мне нужно делать с полемBox для ввода. – David

+0

@David У вас есть два JTextFields, 'fieldBox' и' userInput', и вы используете 'fieldBox' в некоторых местах и' userInput' в других местах. Вам нужен только один, для пользователя, который должен ввести. Вам нужно выбрать один, удалить другой и изменить все виды использования на тот, который был сохранен. –

+0

О, сладкий он работает сейчас. Если вы еще раз поможете мне, это будет выдающимся, цвета фона не будут меняться соответствующим образом. И каждый раз, когда я запускаю его, первое случайное число всегда равно 0, а затем оно меняется на новый номер. – David

1

Я хотел бы написать свою логику без пользовательского интерфейса первой и не проверить его до тех пор, он был на 100% правильным. Просто сначала используйте командную строку, текстовый интерфейс. Как только это будет сделано, поставьте перед ним графический интерфейс. Это поможет изолировать ваши проблемы: как только логика, управляемая текстом, верна, вы поймете, что будущие проблемы связаны с пользовательским интерфейсом.

Он также делает ваш очиститель для мойки MVC.

6

Цвета не меняются, потому что ваш setBackgroundColor всегда использует Color.black. Измените его на:

private void setBackgroundColor(Color color) { 
    setBackground(color); 
} 

Что касается числа, всегда равного нулю. Вы не создаете экземпляр поля randomNumber. Добавьте это в конструкторе:

randomNumber = new Random().nextInt(1001); 

Еще одна проблема, которую я заметил, вы добавили окно слушателя для обеспечения выхода из программы при закрытии окна. Это реализовано в JFrame. В конструкторе добавить:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Вместо того, чтобы использовать устаревший метод:

mainFrame.show(); 

Используйте не рекомендуется:

mainFrame.setVisible(true); 

Кроме того у вас есть поле, которое никогда не опрашивается:

private Color background; 

Лучше всего делать логику, прежде чем подключать ее к ги. Гораздо проще протестировать и найти худшие ошибки.

Refactored код:

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

    public class GuessGame extends JFrame { 
    private JTextField userInput; 
    private JLabel comment = new JLabel("What is your destiny?"); 
    private JLabel comment2 = new JLabel(" "); 

    private int randomNumber; 

    public GuessGame() { 
     super("Guessing Game!"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Creates components 
     JButton guessButton = new JButton("Guess"); 
     JButton quitButton = new JButton("Quit"); 
     JLabel prompt1 = new JLabel("I have a number between 1 and 1000."); 
     JLabel prompt2 = new JLabel("Can you guess my number? Enter your Guess:"); 

     comment = new JLabel("What is your destiny?"); 
     comment2 = new JLabel(" "); 
     userInput = new JTextField(5); 

     //content pane 
     Container c = getContentPane(); 
     setLayout(new FlowLayout()); 

     //adding component to the pane 
     c.add(prompt1); 
     c.add(prompt2); 
     c.add(userInput); 
     c.add(comment2); 
     c.add(guessButton); 
     c.add(quitButton); 
     c.add(comment); 

     guessButton.setMnemonic('G'); 
     quitButton.setMnemonic('Q'); 

     setSize(300, 200); 
     setLocationRelativeTo(null); 
     setVisible(true); 
     setResizable(false); 

     initializeNumber(); 

     //creating the handler 
     GuessButtonHandler ghandler = new GuessButtonHandler(); //instantiate new object 
     guessButton.addActionListener(ghandler); // add event listener 

     QuitButtonHandler qhandler = new QuitButtonHandler(); 
     quitButton.addActionListener(qhandler); 
    } 

    private void initializeNumber() { 
     randomNumber = new Random().nextInt(1000) + 1; 
    } 

    class QuitButtonHandler implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      System.exit(0); 
     } 
    } 

    class GuessButtonHandler implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      int getUserInput; 
      int diff; 
      int Difference; 
      try { 
       getUserInput = Integer.parseInt(userInput.getText().trim()); 
       if (getUserInput == randomNumber) { 
       JOptionPane.showMessageDialog(null, "CONGRATULATIONS! You got it!!", 
         "Random Number: " + randomNumber, 
         JOptionPane.INFORMATION_MESSAGE); 
       initializeNumber(); 
       return; 
       } 
       if (getUserInput > randomNumber) { 
       comment.setText("Too High. Try a lower number."); 
       diff = getUserInput - randomNumber; 
       Difference = Math.abs(diff); 
       } else { 
       comment.setText("Too Low. Try a higher number."); 
       diff = randomNumber - getUserInput; 
       Difference = Math.abs(diff); 
       } 

       if (Difference <= 25) { 
       comment2.setText("Cold"); 
       GuessGame.this.setBackgroundColor(Color.blue); 
       } 

       if (Difference <= 10) { 
       comment2.setText("Warm"); 
       GuessGame.this.setBackgroundColor(Color.red); 
       } 
      } catch (NumberFormatException ex) { 
       comment.setText("Enter a VALID number!"); 
      } 
     } 


    } 

    private void setBackgroundColor(Color color) { 
     getContentPane().setBackground(color); 
    } 

    public static void main(String args[]) { 
     //instantiate gueesgame object 
     GuessGame app = new GuessGame(); 

    } 
    } 
+0

Благодаря человеку, который помогает много, но я не все еще получаю нет цвета, наряду с этой ошибкой: в guessGame.GuessGame $ GuessButtonHandler.setBackgroundColor (GuessGame.java:143) \t в guessGame.GuessGame $ GuessButtonHandler.setBackgroundColor (GuessGame.java:143) \t at guessGame.GuessGame $ GuessButtonHandler.setBackgroundColor (GuessGame.java:143) И когда я сужу его, как 244 (он говорит слишком низко), а затем 245 (он говорит, что он слишком высок) , поэтому я не уверен. – David

+0

Это поможет, если вы разместите обновленный код. Я не уверен, почему фон не изменился, и еще меньше уверен, как это происходит, что 245 слишком велико, а 244 слишком низкое. – Jes

+0

Я сохранил код обновлен, и я только что изменил его с тем, что я отредактировал. – David