Почему утилизация не работает?

Это игра в крестики-нолики, и она отлично работает. Но когда я выигрываю игру и снова нажимаю «Играть», игра закрывается, но я намеревался запустить ее снова. Я использовал dispose, чтобы закрыть текущее окно и запустить другое окно. В другой моей игре утилита работает нормально, но здесь ее нет. Я использовал функцию удаления последней в сообщении. Если кто-то выигрывает игру, я вызываю функцию сообщения. Изменить: МОЙ requiremet заключается в том, что при повторном нажатии на игру текущая игра должна закрыться, и должна начаться новая игра.

package games;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;



public class tictoe extends JFrame implements MouseListener
{
private static final Color COLOR_UNCLICKED = Color.white;
private static final Color COLOR_HITT= Color.CYAN;
private static final Color COLOR_HIT = Color.red;
private static final int UNCLICKED = 5;
private static final int HIT = 7;
private static final int HIT1 = 6;
private JLabel title;
private JPanel titlePanel;
private JButton[][] gridButton;
private JPanel gridPanel;
private final int ROWS = 3;
private final int COLS = 3;
private int[][] board;
int count=0;
GridListener gridListener = new GridListener();

Dimension boardSize = new Dimension(340, 400);
public tictoe()
{
    title = new JLabel("TIC TAC TOE");
    titlePanel = new JPanel();
    titlePanel.add(title);
    gridButton = new JButton[ROWS][COLS];
    board= new int [ROWS][COLS];
    gridPanel = new JPanel();
    gridPanel.setPreferredSize(boardSize);
    gridPanel.setLayout(new GridLayout(3, 3));
    for (int r = 0; r < gridButton.length; r++)
        for (int c = 0; c < gridButton[r].length; c++)
        {
        gridButton[r][c] = new JButton();
        //gridButton[r][c].setBackground(COLOR_UNCLICKED);
        gridButton[r][c].setEnabled(true);
        gridButton[r][c].addActionListener(gridListener);
        gridPanel.add(gridButton[r][c]);
        }
    for (int r = 0; r < board.length; r++)
        for (int c = 0; c < board.length; c++)
        {
        board[r][c] = UNCLICKED;
        gridButton[r][c].setEnabled(true);
        gridButton[r][c].setBackground(COLOR_UNCLICKED);
        }
    this.setLayout(new BorderLayout());
    this.add(titlePanel, "North");
    this.add(gridPanel, BorderLayout.CENTER);
    this.setPreferredSize(new Dimension(400, 400));
}

public static void main(String[] args) {
    tictoe n= new tictoe();
    n.pack();
    n.setVisible(true);
    n.setResizable(false);

}

@Override
public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

}

 class GridListener implements ActionListener
{



public void actionPerformed(ActionEvent evt) {


        //System.out.println(count);

for (int r = 0; r < gridButton.length; r++)
for(int c = 0; c < gridButton[r].length; c++)
{

if (evt.getSource() != gridButton[r][c])
continue;
handleGridButton(r,c);
gridButton[r][c].setEnabled(false);
check();
return;
}
    }
}
 public void handleGridButton(int r, int c)
 {
 if (board[r][c] == UNCLICKED)
 {
     if(count%2==0)
     {
         board[r][c] = HIT;
         gridButton[r][c].setBackground(COLOR_HIT);
         gridButton[r][c].setEnabled(false);
         //((JButton)e.getSource()).setText("x");
     }

 else
 {

     board[r][c] = HIT1;
     gridButton[r][c].setBackground(COLOR_HITT);
     gridButton[r][c].setEnabled(false);
 }
 ++count;
 }
 }
 public void check()
 {
     if(board[0][0]==HIT && board[0][1]==HIT && board[0][2]==HIT)
         message();
     else if (board[0][0]==HIT1 && board[0][1]==HIT1 && board[0][2]==HIT1)
         message();
     else if (board[1][0]==HIT && board[1][1]==HIT && board[1][2]==HIT)
         message();
     else if (board[1][0]==HIT1 && board[1][1]==HIT1 && board[1][2]==HIT1)
         message();
     else if (board[2][0]==HIT && board[2][1]==HIT && board[2][2]==HIT)
         message();
     else if (board[2][0]==HIT1 && board[2][1]==HIT1 && board[2][2]==HIT1)
         message();
     else if(board[0][0]==HIT && board[1][0]==HIT && board[2][0]==HIT)
         message();
     else if(board[0][0]==HIT1 && board[1][0]==HIT1 && board[2][0]==HIT1)
         message();
     else if(board[0][1]==HIT && board[1][1]==HIT && board[2][1]==HIT)
         message();
     else if(board[0][1]==HIT1 && board[1][1]==HIT1 && board[2][1]==HIT1)
         message();
     else if(board[0][2]==HIT && board[1][2]==HIT && board[2][2]==HIT)
         message();
     else if(board[0][2]==HIT1 && board[1][2]==HIT1 && board[2][2]==HIT1)
         message();
     else if(board[0][0]==HIT && board[1][1]==HIT && board[2][2]==HIT)
         message();
     else if(board[0][0]==HIT1 && board[1][1]==HIT1 && board[2][2]==HIT1)
         message();
     else if(board[0][2]==HIT && board[1][1]==HIT && board[2][0]==HIT)
         message();
     else if(board[0][2]==HIT1 && board[1][1]==HIT1 && board[2][0]==HIT1)
         message();



 }
 public void message()
 {
     if(count%2==1)
     { Object[] options = { "Exit", "Play Again" };
     int choice = JOptionPane.showOptionDialog(null, 
         "Player 1 wins", 
         "Quit?", 
         JOptionPane.YES_NO_OPTION, 
         JOptionPane.QUESTION_MESSAGE, 
         null, 
         options, 
         options[0]);

     // interpret the user's choice
     if (choice == JOptionPane.YES_OPTION)
     {
       System.exit(0);
     }
     if (choice == JOptionPane.NO_OPTION)
     {
        dispose();
        tictoe m= new tictoe(); 

     } 
     }
     else
     {
         Object[] options = { "Exit", "Play Again" };
         int choice = JOptionPane.showOptionDialog(null, 
             "Player 2 wins", 
             "Quit?", 
             JOptionPane.YES_NO_OPTION, 
             JOptionPane.QUESTION_MESSAGE, 
             null, 
             options, 
             options[0]);

         // interpret the user's choice
         if (choice == JOptionPane.YES_OPTION)
         {
           System.exit(0);
         }
         if (choice == JOptionPane.NO_OPTION)
         {
           dispose();
            tictoe m= new tictoe(); 

         }
     }
 }
 }

person Vaibhav Setia    schedule 19.07.2017    source источник
comment
Почему вы выбрасываете окно? Просто очистите графический интерфейс и сбросьте все переменные.   -  person QBrute    schedule 19.07.2017
comment
или снова вызовите метод main, который также должен работать нормально   -  person XtremeBaumer    schedule 19.07.2017
comment
и как очистить графический интерфейс? @QBrute   -  person Vaibhav Setia    schedule 19.07.2017
comment
См. stackoverflow.com/questions/1234912/, может там поможет один из ответов. Мне кажется, что dispose() работает только иногда. В javadoc не сказано, что dispose() закрывает окно, по крайней мере, я не так это читаю.   -  person ajb    schedule 19.07.2017
comment
@XtremeBaumer я снова вызываю только основной метод, и он не работает, даже если я не использую dispose и вызываю снова, он не работает   -  person Vaibhav Setia    schedule 19.07.2017
comment
@ajb в одном из комментариев говорится, что dispose уничтожает объект jframe   -  person Vaibhav Setia    schedule 19.07.2017
comment
Уничтожения объекта может быть недостаточно (если они относятся к объекту Java). Есть оконный менеджер, который определяет, что отображается, а что не отображается на экране. dispose() javadoc ничего не говорит об уведомлении оконного менеджера и просьбе удалить окно. И иногда кажется, что оконный менеджер определяет, что объект Java исчез, и разворачивает окно, но иногда это не так. Я действительно не знаю, как это работает, но мне кажется, что лучше всего уведомить оконный менеджер.   -  person ajb    schedule 19.07.2017


Ответы (1)


Для удаления смотрите здесь: https://stackoverflow.com/a/13360489/3319324

Ваша tictoe-переменная m уничтожается сразу после того, как вы ее создали. ТАК не будет новой игровой панели TicToe.

person M. Haverbier    schedule 19.07.2017
comment
Мое требование - открыть другое окно и закрыть предыдущее, как мне это сделать? - person Vaibhav Setia; 19.07.2017
comment
Вы можете дополнить главное окно и второе игровое окно. Таким образом, если вы закроете окно игры, главное окно останется на месте, и вы сможете создать из него новое окно игры. - person M. Haverbier; 19.07.2017