2013-12-02 3 views
1

Я пытаюсь написать программу, в которой вы угадываете случайное сгенерированное число (от 1 до 1000), и программа сообщит вам, приближаетесь ли вы или нет. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно изменить цвет фона в соответствии с тем, насколько близко вы к ответу. Красный ближе, синий - дальше. У меня есть код, но я не могу понять, почему фон не работает. Это как-то связано с контейнером? Спасибо!Программа не меняет цвет

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import java.util.Random;; 
public class GuessGame extends JFrame 
{ 
private JButton newGameButton; 
private JButton enterButton; 
private JButton exitButton; 
private JTextField guessBox; 
private JLabel initialTextLabel; 
private JLabel enterLabel; 
private JLabel userMessageLabel; 
private int randomNumber; 
private int userGuess; 
private int counter = 0; 
private int lastGuess = 0; 
private Color background; 
Container container; 

public GuessGame() 
{ 
    super("Guessing Game"); 
    newGameButton = new JButton("New Game"); 
    exitButton = new JButton("Exit Game"); 
    enterButton = new JButton("Enter"); 
    guessBox = new JTextField(4); 
    initialTextLabel = new JLabel("I have a number between 1 and 1000 can you guess my number?"); 
    enterLabel = new JLabel("Please enter your first guess."); 
    userMessageLabel = new JLabel(""); 
    randomNumber = new Random().nextInt(1000) + 1; 

    container=getContentPane(); 
    container.setLayout(new FlowLayout()); 
    container.add(initialTextLabel); 
    container.add(enterLabel); 
    container.add(guessBox); 
    container.add(newGameButton); 
    container.add(enterButton); 
    container.add(exitButton); 
    container.add(userMessageLabel); 

    setSize(400, 150); 

    addWindowListener(new WindowAdapter() 
    { 
     public void windowClosing(WindowEvent e) 
     { 
      System.exit(0); 
     } 
    }); 

    newGameButtonHandler nghandler = new newGameButtonHandler(); 
    newGameButton.addActionListener(nghandler); 
    ExitButtonHandler exithandler = new ExitButtonHandler(); 
    exitButton.addActionListener(exithandler); 
    enterButtonHandler enterhandler = new enterButtonHandler(); 
    enterButton.addActionListener(enterhandler); 
} 

class newGameButtonHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     getContentPane(); 
     background=Color.lightGray; 
     userMessageLabel.setText(""); 
     randomNumber = new Random().nextInt(1000) + 1; 
    } 
} 

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

class enterButtonHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     userGuess = Integer.parseInt(guessBox.getText()); 
     compareGuess(userGuess, randomNumber); 
    } 
} 

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

public void compareGuess(int userGuess, int randomNumber) 
{ 
    counter++; 
    if (userGuess == randomNumber) 
     { 
      userMessageLabel.setText("You are correct, it took you: " + counter + " tries"); 
      getContentPane(); 
      background=Color.green; 
     } 
    else if (userGuess > randomNumber) 
     { 
      userMessageLabel.setText("Too high"); 
     } 
    else if (userGuess < randomNumber) 
     { 
      userMessageLabel.setText("Too Low"); 
     } 
    if (counter > 1) 
    { 
     if ((randomNumber - userGuess) > (randomNumber - lastGuess)) 
      { 
       getContentPane(); 
       background=Color.red; 
      } 
     else if ((randomNumber - userGuess) < (randomNumber - lastGuess)) 
      { 
       getContentPane(); 
       background=Color.blue; 
      } 
     else 
      { 
       getContentPane(); 
       background=Color.gray; 
      } 
    } 
    lastGuess = userGuess; 
} 
public static void main(String[] args) 
{ 
    GuessGame myGuessGame = new GuessGame(); 
    myGuessGame.setVisible(true); 
} 
} 
+0

* «у меня есть число от 1 до 1000 вы можете догадаться мой номер?» * ради простого тестирования, может вы 'System. out.println (Thenumber) '?!? –

ответ

3
  1. Вы пытаетесь переопределить paint(Graphics g) функцию JFrame. Мы не должны переопределять функцию красок компонента верхнего уровня, например JFrame.

  2. Используйте специальный компонент, расширяющий JPanel, и переопределите его функцию paintComponent(Graphics g) и не забудьте вызвать super.paintComponent(g) внутри этой функции.

  3. Если какое-либо обновление должно быть сделано для окраски компонента, вызовите component.repaint() на этом компоненте, чтобы отразить изменения в графическом интерфейсе.

Пожалуйста, тур на официальную страницу учебника: Lesson: Performing Custom Painting

+0

Спасибо, # 3 помогли. –

+0

@BethanyBrown, все они в конечном итоге помогут. :) Пожалуйста, перейдите на связанную страницу учебника, чтобы узнать подробности. Это будет полезно в ближайшем будущем. – Sage

+0

Мне удалось немного поиграть с ним и заставить его работать. Как я уже сказал, №3 помог мне больше всего (только потому, что меня заставляло думать иначе), мне нравится учебник по рисованию в java. Спасибо за помощь. :) –

2

Я дополнение к комментариям Мудреца, вы звоните setBackground внутри paint, которая просто собирается сделать еще один запрос на paint ... снова и снова и снова ...

Другая проблема заключается в том, что вы меняете фон кадра, а не его содержимое.

Вместо этого, чтобы избавиться от вашего метода paint, вы ничего не делаете с ним ...

Вместо этого, когда вы хотите изменить цвет, просто вызовите getContentPane().setBackground(...), например ...

class newGameButtonHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     getContentPane().setBackground(Color.lightGray); 
     userMessageLabel.setText(""); 
     randomNumber = new Random().nextInt(1000) + 1; 
    } 
} 

Если это не работает, вам может понадобиться позвонить getContentPane().repaint()

+0

проклятье я даже не заметил этого. И мой отказ заметить заставил вас быть сумасшедшим * +1 :) – Sage

+0

@Sage Все это в конечном итоге создает знания OP;) – MadProgrammer

Смежные вопросы