Search code examples
javaswingjpanelresetminesweeper

How to reset JFrame (restart game) using a JMenuItem?


I am making a minesweeper, using actionPerformed method (I know how to use it) at any time, I want to reset the game, make a whole new JFrame of the game and closing the old one. (the map is generated in JuegoBuca(), by an object from another class). The game is already working. Also I know how to use the JMenu, the JMenuBar, and the JMenuItem.

The code of my "main class", where everything takes place.

public class JuegoBuca extends JFrame implements MouseListener, ActionListener {

    private JPanel buca, norte;
    private Botones[][] botones;
    private Datos[][] datos;
    private Mapa panel;
    private int numerominas, banderas, minasdescubiertas, clicks, caso;
    private JMenuBar barraMenu;
    private JMenu juego;
    private JMenuItem nuevo, opciones, salir;
    private ImageIcon bandera, bombStar, bombCross, bombHelp, bomb;
    private boolean estado, juegonuevo;

    private JuegoBuca() {

        setVisible(true);
        setSize(250, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Buscaminas");
        setResizable(false);
        //Partes del juego
        panel = new Mapa();
        botones = new Botones[5][5];
        datos = new Datos[5][5];
        buca = new JPanel(new GridLayout(5, 5));
        norte = new JPanel();
        //Variables de información
        banderas = clicks = caso = 0;
        int n = panel.getNumerominas();
        numerominas = n;
        minasdescubiertas = 0;
        estado = juegonuevo =  false;
        //Barra menu y opciones menu
        barraMenu = new JMenuBar();
        juego = new JMenu("Juego");
        //////////////// Jerarquía
        salir = new JMenuItem("Salir");
        salir.addActionListener(this);
        nuevo = new JMenuItem("Nuevo");
        nuevo.addActionListener(this);
        opciones = new JMenuItem("Opciones");
        opciones.addActionListener(this);
        //////////////////////////////////Imagenes
        bandera = new ImageIcon(getClass().getResource("bandera.png"));
        bombStar = new ImageIcon(getClass().getResource("bomb_star.png"));
        bombCross = new ImageIcon(getClass().getResource("bomb_cross.png"));
        bombHelp = new ImageIcon(getClass().getResource("bomb_help.png"));
        bomb = new ImageIcon(getClass().getResource("bomb.png"));

        barraMenu.add(juego);
        juego.add(nuevo);
        juego.add(opciones);
        juego.addSeparator();
        juego.add(salir);
        setJMenuBar(barraMenu);

        norte.add(new JLabel("Clicks " + clicks + "      Minas:  " + numerominas));
        int index = 1;
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                buca.add(botones[i][j] = new Botones());
                botones[i][j].addMouseListener(this);
                botones[i][j].setIndice1(index);
                botones[i][j].setIcon(null);
                datos[i][j] = new Datos();
                if (panel.obtenerValorPanel(i, j) == 0) {
                    datos[i][j].ponerLabel(" ");
                } else if (panel.obtenerValorPanel(i, j) == 64) {

                    datos[i][j].setIcon(bombStar);

                } else {
                    datos[i][j].ponerLabel(Integer.toString(panel.obtenerValorPanel(i, j)));
                }


                index++;
            }
        }

        add(buca, BorderLayout.CENTER);
        add(norte, BorderLayout.NORTH);

        actualizar();
    }

    public static void main(String args[]) {

        JuegoBuca juego = new JuegoBuca();
    }

    private void actualizar() {...}

    @Override
    public void mouseClicked(MouseEvent e) {...}

    @Override
    public void mousePressed(MouseEvent e) {...}

    @Override
    public void actionPerformed(ActionEvent e) {
         Object o = e.getSource();
         if (o == salir) {
            System.exit(0);
        } else if(o == nuevo) {

            //RESET GAME...
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {...}

    @Override
    public void mouseEntered(MouseEvent e) {...}

    @Override
    public void mouseExited(MouseEvent e) {...}

    public void indicadores(Object o) {...}

    public void logicaJuego(Object o) {...}

    public void dibuja() {...}

    public int minasdesc() {...}

    public boolean Jugar() {...}


}

If anyone need more info or something, please tell me. Thanks.


Solution

  • Try to do next :

    JuegoBuca.this.setVisible(false);
    JuegoBuca.this.dispose();
    new JuegoBuca();
    

    in your :

    if(o == nuevo) {
        //RESET GAME...
    }
    

    But I recommend you to clear all your resources and reuse existed frame.