Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 游戏场景的多个JFrame_Java_Swing_Jframe - Fatal编程技术网

Java 游戏场景的多个JFrame

Java 游戏场景的多个JFrame,java,swing,jframe,Java,Swing,Jframe,如果标题有点不正确,我很抱歉 我最近开始了一个新的游戏项目,并考虑在Java中使用多个JFrames 原因是我的游戏有2个JFrames: 1) 主菜单(单件菜单) 2) 战斗 现在,主菜单JFrame将在自己的EDT上初始化战斗JFrame,然后通过setVisible(false)隐藏自己,当游戏结束时setVisible(true)可以从主菜单框架单例上的战斗框架调用 注意:我这样做的原因是,主菜单EDT可以在战斗JFrame中重用,因此只有1个EDT,但有2个JFrame。为了防止战斗帧

如果标题有点不正确,我很抱歉

我最近开始了一个新的游戏项目,并考虑在Java中使用多个
JFrame
s

原因是我的游戏有2个
JFrame
s:

1) 主菜单(单件菜单)

2) 战斗

现在,主菜单
JFrame
将在自己的EDT上初始化战斗
JFrame
,然后通过
setVisible(false)
隐藏自己,当游戏结束时
setVisible(true)
可以从主菜单框架单例上的战斗框架调用

注意:我这样做的原因是,主菜单EDT可以在战斗
JFrame
中重用,因此只有1个EDT,但有2个JFrame。为了防止战斗帧处于活动状态(由于在同一EDT上而关闭后),我执行
setDefaultCloseOperation(JFrame.DISPOSE_on_CLOSE)

问题:

这是允许的还是有更好的方法

我想到了一个
CardLayout
,但由于每次用户按下Start
JButton
时都必须创建一个新的
GamePanel
,因此我无法启动单个实例并将其设置为卡

原因是我知道在java中做游戏编程时,你做了很多事情,没有考虑好的练习(比如设置位置,而不是使用LayOutMaultor)< /P> 为了帮助在我的主菜单UI中澄清开始游戏
JButton
的actionPerformed()方法,我有:

 class MainMenu extends JFrame implements ActionListener {
        ...
            public void actionPerformed(..){
            NarutoGame narutoGame = null;
                narutoGame = new NarutoGame(...);

            narutoGame.setVisible(true);//running in MainMenu EDT
            //set this panels containing frame (MainMenu) to not visible
            }
        ...
   MainMenu getInstance() {
        ...
   }
 }
当游戏在战斗JFrame中结束时:

class BattleField extends JFrame  {
    ...
    private void gameOver() {
        MainMenu.getInstance().setVisible(true);
        dispose();//dipsose of Battle JFrame
    }
    ...
}
为了培养用户的意愿,以及简单的多样性,游戏经常以新颖的方式推动用户界面设计。在实践中,多帧的吸引力可能不会超过风险。除了举出的众所周知的问题外,我还要补充举出的噩梦


如果
CardLayout
不合适,那么在
resetGame()
中调用
removeAll()
就是一个例子,请参见@andrewhompson谢谢,但正如我所说的,我知道这不是一个好的做法,但在创建游戏时,我们经常需要模糊这些好的和坏的做法来实现我们所需要的。正如在问题中所说,我不能使用卡片布局,并且我说明了为什么“自己的EDT”会影响你?只有一个EDT可以从中提取所有组件painted@david所以不要。简单地“删除”菜单窗格并“添加”您的游戏窗格,或者在游戏屏幕上使用控制器窗格并根据需要添加每个新实例?@DavidKroukamp:是一个简单地调用
removeAll()
中的
removeAll()
+1谢谢您的问题解决了,实际上选择了后者(
removeAll()
)因为我可以动态地(每次创建一个新面板)完成这项工作,谢谢!!