Screen stops responding after clicking one of the buttons

1

I'm doing a simple game show of the old woman next to Swing. I wanted to know why, when I trigger an event to click through the ActionPerfomed method, my program freezes. I've been researching a bit and found that these are normal interface issues because of the Thread running. If anyone can explain the error and why this happens, I would be grateful.

Comparison class and value insertion

public class JogoVelha {

private int [][] tabuleiro = new int[3][3];

public int[][] getTabuleiro()
{
   return this.tabuleiro;
}

//Seta valores do tabuleiro

public void setTabuleiroValor(int posicaoLinha,int posicaoColuna,int 
jogador)
{
   this.tabuleiro[posicaoLinha][posicaoColuna] = jogador;
}

//Cria valores dos jogadores
public String  jogadores(int jogador)
{
   Map<Integer,String> jogadores = new HashMap<Integer,String>();

   jogadores.put(1, "JOGADOR 1");
   jogadores.put(2, "JOGADOR 2");

   return jogadores.get(jogador); 
}

 @SuppressWarnings("unused")
 public boolean  verificarPartida(int [][] tabuleiro,int jogador)
    {
   //compara os valores da linha/coluna

    for(int i = 0; i <2;i++)
    {
       if( tabuleiro[0][i] == jogador && tabuleiro[1][i] == jogador && 
       tabuleiro[2][i] == jogador)
       {
       return true;
       }
       continue;
   }

   //compara os valores  coluna/ linha

   for(int i= 0;i<2;i++)
   {
       if(tabuleiro[i][0] == jogador && tabuleiro[i][1] == jogador && 
       tabuleiro[i][2] == jogador)
       {
       return true;
       }
       continue;
   }

   //Comparar os valores das linhas que interceptam no meio
   if(tabuleiro[0][0] == jogador && tabuleiro[1][1] == jogador 
   &&tabuleiro[2][2] == jogador)
     return true;

   else if (tabuleiro[0][2] == jogador && tabuleiro[1][1] == jogador 
   &&tabuleiro[2][0] == jogador)
       return true;

   return false;
}

UI creation class

public class View extends JFrame implements ActionListener {

public static int jogadorValue = 1;
public static Integer turnos = 1; 

JLabel lblJogoVelha = new JLabel("Jogo da Velha");
JLabel lblTurno = new JLabel("Turno");
JLabel lblTurnoNumber = new JLabel();
JLabel lblAjogar= new JLabel();
JLabel lblJogador = new JLabel();

public JButton b1 = new JButton("b1");
public JButton b2 = new JButton("b2");
public JButton b3 = new JButton("b3");
public JButton b4 = new JButton("b4");
public JButton b5 = new JButton("b5");
public JButton b6 = new JButton("b6");
public JButton b7 = new JButton("b7");
public JButton b8 = new JButton("b8");
public JButton b9 = new JButton("b9");





JogoVelha jogoVelha = new JogoVelha();


public void setarListener()
{
    b1.addActionListener(this);
    b2.addActionListener(this);
    b3.addActionListener(this);
    b4.addActionListener(this);
    b5.addActionListener(this);
    b6.addActionListener(this);
    b7.addActionListener(this);
    b8.addActionListener(this);
    b9.addActionListener(this);
}

public void adicionarViewButtons()
{
    getContentPane().add(b1);
    getContentPane().add(b2);
    getContentPane().add(b3);
    getContentPane().add(b4);
    getContentPane().add(b5);
    getContentPane().add(b6);
    getContentPane().add(b7);
    getContentPane().add(b8);
    getContentPane().add(b9);
}

public void atribuirValorTabuleiro(String name)
{
    switch(name)
    {
    case "b1":
          jogoVelha.setTabuleiroValor(0, 0, jogadorValue);
          break;

    case "b2":
          jogoVelha.setTabuleiroValor(0, 1, jogadorValue);
          break;

    case "b3":
          jogoVelha.setTabuleiroValor(0, 2, jogadorValue);
          break;

    case "b4":
          jogoVelha.setTabuleiroValor(1, 0, jogadorValue);
          break;    

    case "b5":
          jogoVelha.setTabuleiroValor(1, 1, jogadorValue);
          break;          
    case "b6":
          jogoVelha.setTabuleiroValor(1, 2, jogadorValue);
          break;          

    case "b7":
          jogoVelha.setTabuleiroValor(2, 0, jogadorValue);
          break;          

    case "b8":
          jogoVelha.setTabuleiroValor(2, 1, jogadorValue);
          break;    

    case "b9":
          jogoVelha.setTabuleiroValor(2, 2, jogadorValue);
          break;

    default:
        break;
    }
}


@Override
public void actionPerformed(ActionEvent e) {

             turnos ++;
             lblTurnoNumber.setText(turnos.toString());;


             if(turnos == 10)
             {
                 JOptionPane.showMessageDialog(null, "Empate");
             }
             else
             {
                if(jogadorValue == 1)
                {

                setEnabled(false);
                atribuirValorTabuleiro(((JButton)e.getSource()).getText());
                ((JButton) e.getSource()).setText("X");
                ((JButton) e.getSource()).revalidate();

                if(turnos >=5)
                {
                    jogoVelha.verificarPartida(jogoVelha.getTabuleiro(), jogadorValue);
                    JOptionPane.showConfirmDialog(null, "Vencedor é: " + jogoVelha.jogadores(jogadorValue), "Vencedor", 3, 4);
                }
                jogadorValue ++;

                }

                else    
                {   
                     atribuirValorTabuleiro((((JButton)e.getSource()).getText()));
                    ((JButton) e.getSource()).setText("O");
                    ((JButton) e.getSource()).revalidate();

                    if(turnos >=5)
                    {
                        jogoVelha.verificarPartida(jogoVelha.getTabuleiro(), jogadorValue);
                        JOptionPane.showConfirmDialog(null, "Vencedor é: " + jogoVelha.jogadores(jogadorValue), "Vencedor", 3, 4);
                    }
                    jogadorValue --;

                }
            }
        }




public View()
{
    getContentPane().add(lblJogoVelha);
    getContentPane().add(lblTurno);
    getContentPane().add(lblTurnoNumber);
    this.adicionarViewButtons();
    this.setarListener();
    setLayout(new GridLayout(4, 3));
    lblTurnoNumber.setText(turnos.toString());
    setSize(500, 500);
    setVisible(true);


}

 public static void main(String[] args){
      SwingUtilities.invokeLater(new Runnable() {
      public void run() {
      View tela = new View();
      tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      tela.setVisible(true);
    }
});

 }
}
    
asked by anonymous 29.11.2017 / 22:34

1 answer

0

The application is not crashing, the problem is that you are deactivating the screen in the section below, within actionPerformed() :

if (jogadorValue == 1) {

    setEnabled(false);
    atribuirValorTabuleiro(((JButton) e.getSource()).getText());
    ((JButton) e.getSource()).setText("X");
    ((JButton) e.getSource()).revalidate();

    if (turnos >= 5) {
        jogoVelha.verificarPartida(jogoVelha.getTabuleiro(), jogadorValue);
        JOptionPane.showConfirmDialog(null, "Vencedor é: " + jogoVelha.jogadores(jogadorValue), "Vencedor",
                3, 4);
    }
    jogadorValue++;

}

Remove this setEnabled(false) that everything works again without crashing the screen.

I think it's worth alerting to this line too:

JOptionPane.showConfirmDialog(null, "Vencedor é: " + jogoVelha.jogadores(jogadorValue),
 "Vencedor", 3, 4);

In addition this method does not seem appropriate for this, since showConfirmDialog() " opens a modal window to confirm some questioning and there are none, you are passing invalid values.

The last two parameters received by this method refer to:

  • optionType - represents exactly the button options available to the user to click according to the question, and the valid values are YES_NO_OPTION , YES_NO_CANCEL_OPTION , or OK_CANCEL_OPTION . None of these constants is 3.

  • messageType - represents the type of message displayed. Valid values are: ERROR_MESSAGE , INFORMATION_MESSAGE , WARNING_MESSAGE , QUESTION_MESSAGE , or PLAIN_MESSAGE . None of them are worth 4.

Always read the documentation to avoid problems of this type. All that I've explained is there.

There are other problems in the code, but they are not part of the focus of the question.

    
30.11.2017 / 01:06