Question

The title of this quesiton speaks for itself. I am making a clone of minesweeper using a JFrame and have just finished the starting screen where the player selects a game size. When a button is clicked, the Frame is supposed to clear ready for the game screen. When I click a button, the button remains in the "pressed" state and the JFrame freezes and I have to close it down. What am I doing wrong?

Code:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class Minesweeper extends JFrame implements ActionListener{

    JLabel starttitle;
    ButtonObject[] gamefield;
    JFrame frame;
    JPanel startscreen;
    JPanel gamescreen;
    int gamesize;
    JButton ten;
    JButton tfive;
    JButton fifty;

    GridLayout layout; 



    public Minesweeper()
    {
        frame = new JFrame("Minesweeper");
        frame.setSize(500,500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);;
        startscreen = new JPanel();
        startScreen();
    }

    public void startScreen()
    {
        ten = new JButton("10 x 10");
        tfive = new JButton("25 x 25");
        fifty = new JButton("50 x 50");
        starttitle = new JLabel("Welcome to minesweeper. Click a game size to begin.");
        frame.add(startscreen);
        startscreen.add(starttitle);
        startscreen.add(ten);
        startscreen.add(tfive);
        startscreen.add(fifty);
        ten.addActionListener(this);
        tfive.addActionListener(this);
        fifty.addActionListener(this);
    }
    public void gameScreen()
    {
        frame.getContentPane().removeAll();//freezes JFrame
    }
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource()==ten)
        {
            gamesize = 10;

            gameScreen();
        }
        else if(e.getSource()==tfive)
        {
            gamesize = 25;

            gameScreen();
        }
        else if(e.getSource()==fifty)
        {
            gamesize = 50;

            gameScreen();
        }
        else
        {
            System.out.println("Fatal error");
        }

    }
    public static void main(String[] args)
    {
        new Minesweeper();
    }
}
Was it helpful?

Solution

It doesn't freeze, call repaint() method of your frame, and all components will be clear.

just add next line in your actionPerformed():

 frame.repaint();

OTHER TIPS

just like this..

    public void gameScreen()
    {
        frame.getContentPane().removeAll();
        frame.repaint();
    }
  • JFrame's default LayoutManager is Borderlayout

  • all changes to the already visible Swing GUI (add, remove, resize, modify) must propertly to notify used LayoutManager

  • standard notifier for JFrame is frame.(re*)validate and frame.repaint()**,

    1. *- in Java7 and newer versions

    2. ** - not required in all cases(for JTextComponents, JFrame.pack(), e.i.), by default is better to use this code line too

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top