1

这个问题的标题不言自明。我正在使用 JFrame 制作扫雷游戏的克隆,并且刚刚完成了玩家选择游戏大小的起始屏幕。单击按钮时,应该清除框架以准备进入游戏屏幕。当我单击一个按钮时,该按钮仍处于“按下”状态,JFrame 冻结,我必须将其关闭。我究竟做错了什么?

代码:

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();
    }
}
4

3 回答 3

5

它不会冻结,调用repaint()框架的方法,所有组件都会清晰。

只需在您的中添加下一行actionPerformed()

 frame.repaint();
于 2013-11-12T11:27:55.133 回答
2
  • JFrame的默认值LayoutManagerBorderlayout

  • 对已经可见的 Swing GUI 的所有更改(添加、删除、调整大小、修改)必须正确通知已使用LayoutManager

  • JFrameisframe.(re*)validate和的标准通知器frame.repaint()**

    1. *- 在 Java7 和更新版本中

    2. ** - 并非在所有情况下都需要(for JTextComponents, JFrame.pack(), ei),默认情况下最好也使用此代码行

于 2013-11-12T12:05:21.430 回答
2

像这样..

    public void gameScreen()
    {
        frame.getContentPane().removeAll();
        frame.repaint();
    }
于 2013-11-12T11:30:27.903 回答