[Resolvido]GUI parece não responder

3 respostas
P

Boa tarde gente, estou tentando fazer um exercício do Deitel sobre GUI, se alguém tiver o livro, é a página 627, exercício 14.14. Então, pra quem não tiver o exercício é o seguinte, tenho que gerar um número inteiro aleatório entre 1 e 1000 e o usuário deve tentar advinhar o número, se o número for abaixo do gerado, a tela do GUI deve ficar azul e a mensagem, “too low” deve ser exibida, se for maior que o número gerado a tela do GUI deve mudar para vermelhor e o número a mensagem “too high” deve ser exibida. Eu fiz assim:

package Exercícios;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GuessNumber extends JFrame{
    private JTextField textField;
    private JLabel label;
    private JLabel helpLabel;
    private int number;
    private JPanel panel;
    private BorderLayout layout;
    private JButton button;
    
    public GuessNumber(){
       super("Can you guess the number?");
       layout = new BorderLayout();
       setLayout(layout);
       
       label = new JLabel("I Have a number between 1 and 1000. Can you guess my "
                + "number? \n");
       helpLabel = new JLabel("Hello");
       
       button = new JButton("Again ?");
       buttonHandler b = new buttonHandler();
       button.addActionListener(b);
       textField = new JTextField();
       textFieldHandler handler = new textFieldHandler();
       textField.addActionListener(handler);
       
       panel = new JPanel();
       panel.setLayout(new GridLayout(1,2));
       panel.add(textField);
       panel.add(helpLabel);
       add(label,BorderLayout.NORTH);
       add(panel,BorderLayout.CENTER);
       add(button,BorderLayout.SOUTH);
       
       
    }
            
    public class textFieldHandler implements ActionListener{
        int translator = -1;
        String aux;
        
        @Override
        public void actionPerformed(ActionEvent e){
            number = (int)(Math.random() * 1000 + 1);
            
            while(translator != number)
            {
                aux = textField.getText();
                translator = Integer.parseInt(aux);
                
                if(translator < number)
                {
                    getContentPane().setBackground(Color.BLUE);
                    helpLabel.setText("Too Low.");
                }
                else
                {
                    if(translator > number)
                    {
                        getContentPane().setBackground(Color.RED);
                        helpLabel.setText("Too High.");
                        
                    }
                    else
                    {
                        helpLabel.setText("Correct!");
                        textField.setEditable(false);
                        break;
                    }
                }
            }
        }
    }
    
    private class buttonHandler implements ActionListener{
        
        @Override
        public void actionPerformed(ActionEvent e){
            textFieldHandler t = new textFieldHandler();
            textField.setEditable(true);
            textField.addActionListener(t);
        }
    }
}

e a main:

package Exercícios;

import javax.swing.JFrame;

public class GuessNumberTest {
    public static void main(String[] main){
        GuessNumber g = new GuessNumber();
        g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        g.setSize(400,100);
        g.setVisible(true);
    }
}

é estranho porque nem mesmo essa parte "g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); "está funcionando, porque quando eu aperto o X da janela para fechar, a janela não fecha, só se eu interromper mesmo o programa que fecha. Então, o GUI é gerado tudo bonitinho , o prompt fica no JTextField certinho mas, quando eu digito o primeiro inteiro teclo Enter, o GUI pára de responder, o backgorund não muda de cor e nem o JLabel muda o conteúdo, alguém sabe dizer por que isso?

3 Respostas

Ivan_Alves

Você pode estar entrando em um loop infinito e ao chama o evento ele fica executando dentro do laço

e por isso não deixar fechar e nem mostrar a alteração.
Para verificar isso use o depurador ou coloque um System.out.println dentro desse loop

Ivan_Alves

Uma dica, você não precisa dessa loop

P

Muuuito obrigado Ivan Alves, esse negócio de orientação a eventos é bem novo pra mim, então sempre penso de forma OO que acaba me levando um pouco a programação procedural nesse caso, rodou direitinho entendi sua dica, brigadão.

Criado 12 de novembro de 2012
Ultima resposta 12 de nov. de 2012
Respostas 3
Participantes 2