Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java.Swing中重置扫雷游戏板_Java_Eclipse_Swing_Class_Reset - Fatal编程技术网

如何在Java.Swing中重置扫雷游戏板

如何在Java.Swing中重置扫雷游戏板,java,eclipse,swing,class,reset,Java,Eclipse,Swing,Class,Reset,我一直在试图让我的代码复位后,点击OK按钮滑块,但我没有这样的运气。有人知道我如何将其合并到代码中吗 另外,重置必须在类字段中 package GUI; import java.awt.GridLayout; import javax.swing.JPanel; public class GameDisplay extends JPanel { private static final long serialVersionUID = 1L; private boolean a

我一直在试图让我的代码复位后,点击OK按钮滑块,但我没有这样的运气。有人知道我如何将其合并到代码中吗

另外,重置必须在类字段中

package GUI;

import java.awt.GridLayout;
import javax.swing.JPanel;

public class GameDisplay extends JPanel {
    private static final long serialVersionUID = 1L;
    private boolean activated;

    public GameDisplay(Model.Field field) {
        setLayout(new GridLayout(GUI.SizeDialog.currentRows, GUI.SizeDialog.currentColumns));
        for (int i = 0; i < GUI.SizeDialog.currentRows; ++i) {
            for (int j = 0; j < GUI.SizeDialog.currentColumns; ++j) {
               add(field.Cells[i][j]);   
            }
        }
    }

    public boolean isActive() {
        return activated;
    }

    public void setActive(boolean activated) {
        this.activated = activated;
    }
}
SizeDialog
App

您的
字段
类的实例当前正在
应用程序
类中创建。您在
SizeDialog
类中的私有字段
field
当前未设置为
App
类已知的实例。此问题的解决方案是提供
字段
实例作为参数

可能的解决办法如下:

应用程序:

大型机:

public class MainFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private static JPanel centerPanel;
    public static final String EASY = "Easy";
    public static final String NORMAL = "Normal";
    public static final String HARD = "Hard";

    private Model.Field field;

    public MainFrame(JPanel centerPanel, Model.Field field) {
        this.field = field;
        /* the rest of your code */
    }

    public JMenuBar setUpMenuBar(ActionListener listener) {
        // create the necessary menu items and menus
        JMenuBar menuBar = new JMenuBar();

        JMenu settingsMenu = new JMenu("Settings");
        JMenuItem size = new JMenuItem("Size");

        size.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Object valueBox = new SizeDialog(field);
                ((Window) valueBox).setVisible(true);
            }
        });
        /* the rest of your code */
    }

    /* more MainFrame code */
}
SizeDialog:

public class SizeDialog extends JDialog {

    private static final long serialVersionUID = 1L;
    private final Model.Field field;
    private GUI.GameDisplay GameDisplay;
    public static Integer currentRows = 4;
    public static Integer currentColumns = 4;

    public SizeDialog(final Model.Field field) {
        this.field = field;
        /* the rest of your code */
    }

    /* more SizeDialog code */
}

编辑:如中所述,匿名类中引用的对象必须是最终对象。

何时在SizeDialog中设置私有模型。字段?现在我看不到正在设置Field类的实例。当您按下按钮时,这可能会给您一个nullpointerexception。@Simon那么您指的是类似这样的字段=new Model.field();确切地或者类似于GameDisplay类的构造函数中的参数。你能提供创建游戏显示和SizeDialog的代码吗?@Simon我刚刚编辑了主条目,以包括大型机和应用程序(请注意,我已经实现了实例集,并且该方法没有改变按钮网格)。我们现在出现了一个错误,该方法在没有最终结果的情况下无法调用,但是字段=new Model.field();不允许这样做final@Jackson我没有意识到这一限制。我已将SizeDialog的字段变量和参数更改为final。我仍然收到此错误:未解决的编译问题:无法在其他方法中定义的内部类中引用非final变量字段(如果我更改SizeDialog(Model.Field)到SizeDialog(final Model.Field)它解决了这个问题,但Field=new Model.Field();要求为“无”final@Jackson不幸的是,我现在无法进一步帮助您。我目前无法访问带有Java编译器的机器来尝试重现您的问题。我在一个在线编译器中尝试了一个小演示,它是在我添加了最终关键字后编译的。您是否只对privat应用了finale final Model.Field字段;和public final SizeDialog(Model.Field字段){in SizeDialog
package GUI;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class MainFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private static JPanel centerPanel;
    public static final String EASY = "Easy";
    public static final String NORMAL = "Normal";
    public static final String HARD = "Hard";

    public MainFrame(JPanel centerPanel) {
        // Setup of Main
        super("The True/False Game");
        this.centerPanel = centerPanel;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setup();
    }

    private void setup() {
        // Setup of centerPanel
        add(centerPanel);
        pack();
    }

    public JMenuBar setUpMenuBar(ActionListener listener) {
        // create the necessary menu items and menus
        JMenuBar menuBar = new JMenuBar();

        JMenu settingsMenu = new JMenu("Settings");
        JMenuItem size = new JMenuItem("Size");

        size.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Object valueBox = new SizeDialog();
                ((Window) valueBox).setVisible(true);
            }
        });

        JMenu difficultyMenu = new JMenu("Difficulty Level");
        ButtonGroup levelGroup = new ButtonGroup();
        JCheckBoxMenuItem easyDifficultyItem = new JCheckBoxMenuItem(EASY);
        JCheckBoxMenuItem normalDifficultyItem = new JCheckBoxMenuItem(NORMAL);
        JCheckBoxMenuItem hardDifficultyItem = new JCheckBoxMenuItem(HARD);

        easyDifficultyItem.setSelected(true); // Default difficulty setting

        // this button group ensures that only one check box is selected
        levelGroup.add(easyDifficultyItem);
        levelGroup.add(normalDifficultyItem);
        levelGroup.add(hardDifficultyItem);

        difficultyMenu.add(easyDifficultyItem);
        difficultyMenu.add(normalDifficultyItem);
        difficultyMenu.add(hardDifficultyItem);

        settingsMenu.add(size);
        settingsMenu.add(difficultyMenu);
        menuBar.add(settingsMenu);

        // use a single listener to handle all menu item selections
        for (int i = 0; i < menuBar.getMenuCount(); ++i) {
            for (JMenuItem item : getMenuItems(menuBar.getMenu(i))) {
                item.addActionListener(listener);
            }
        }

        return menuBar;

    }

    // this recursion works because JMenu is a subclass of JMenuItem!
    private static List<JMenuItem> getMenuItems(JMenuItem item) {
        List<JMenuItem> items = new ArrayList<>();

        if (item instanceof JMenu) {
            JMenu menu = (JMenu) item;
            for (int i = 0; i < menu.getItemCount(); ++i) {
                items.addAll(getMenuItems(menu.getItem(i)));
            }
        } else {
            items.add(item);
        }

        return items;
    }

}
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JMenuBar;

import Model.Cell;
import Model.Field;
import GUI.MainFrame;
import GUI.SizeDialog;

public class App {
    // Main Objects
    private static GUI.MainFrame MainFrame;
    private static GUI.GameDisplay GameDisplay;
    private static Model.Field field;
    public static GUI.SizeDialog SizeDialog;


    public static void main(String[] args) {
        // Setup of the Main Objects
        field = new Model.Field();
        GameDisplay = new GUI.GameDisplay(field);
        MainFrame = new MainFrame(GameDisplay);
        MainFrame.setMinimumSize(new Dimension(500, 500));

        MainFrame.getContentPane().add(GameDisplay);
        // Setup of the Menu Bar
        JMenuBar menuBar = MainFrame.setUpMenuBar(menuListener);
        MainFrame.setJMenuBar(menuBar);

        // Show the Mainframe in the center of the desktop screen
        MainFrame.setLocationRelativeTo(null);
        MainFrame.setVisible(true);
    }


    // listener for the menu items in MainFrame
    private static ActionListener menuListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            switch (e.getActionCommand()) {

            case GUI.MainFrame.EASY:
                field.setDifficultyFactor(Field.EASY);
                GameDisplay.setActive(true);
                break;

            case GUI.MainFrame.NORMAL:
                field.setDifficultyFactor(Field.NORMAL);
                GameDisplay.setActive(true);
                break;

            case GUI.MainFrame.HARD:
                field.setDifficultyFactor(Field.HARD);
                GameDisplay.setActive(true);
                break;
            }
        }

    };
};
public class App {
    // Main Objects
    private static GUI.MainFrame MainFrame;
    private static GUI.GameDisplay GameDisplay;
    private static Model.Field field;
    public static GUI.SizeDialog SizeDialog;


    public static void main(String[] args) {
        // Setup of the Main Objects
        field = new Model.Field();
        GameDisplay = new GUI.GameDisplay(field);
        MainFrame = new MainFrame(GameDisplay, field);

        /* the rest of your code */
    }

    /* more App code */
}
public class MainFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private static JPanel centerPanel;
    public static final String EASY = "Easy";
    public static final String NORMAL = "Normal";
    public static final String HARD = "Hard";

    private Model.Field field;

    public MainFrame(JPanel centerPanel, Model.Field field) {
        this.field = field;
        /* the rest of your code */
    }

    public JMenuBar setUpMenuBar(ActionListener listener) {
        // create the necessary menu items and menus
        JMenuBar menuBar = new JMenuBar();

        JMenu settingsMenu = new JMenu("Settings");
        JMenuItem size = new JMenuItem("Size");

        size.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Object valueBox = new SizeDialog(field);
                ((Window) valueBox).setVisible(true);
            }
        });
        /* the rest of your code */
    }

    /* more MainFrame code */
}
public class SizeDialog extends JDialog {

    private static final long serialVersionUID = 1L;
    private final Model.Field field;
    private GUI.GameDisplay GameDisplay;
    public static Integer currentRows = 4;
    public static Integer currentColumns = 4;

    public SizeDialog(final Model.Field field) {
        this.field = field;
        /* the rest of your code */
    }

    /* more SizeDialog code */
}