Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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 根据布尔值是否等于true或false删除/添加JComponents_Java_Swing_Timer_Jbutton_Actionlistener - Fatal编程技术网

Java 根据布尔值是否等于true或false删除/添加JComponents

Java 根据布尔值是否等于true或false删除/添加JComponents,java,swing,timer,jbutton,actionlistener,Java,Swing,Timer,Jbutton,Actionlistener,在我目前正在制作的游戏中,我刚刚创建了一个起始屏幕。开始屏幕有4个按钮,包括播放、选项、信用和退出。如果你按Play,另一个JButton将出现,新游戏 我不希望这样,当你按下“新建游戏”按钮时,开始屏幕消失,游戏开始(实际游戏和开始屏幕都会扩展JComponent) 我有一个单独的类来运行游戏和处理游戏中的选项菜单 在starting screen类中,我有一个名为startName的布尔值,该布尔值默认等于false,当您按下New Game按钮时,它将等于true。在开始菜单类中,我还有一

在我目前正在制作的游戏中,我刚刚创建了一个起始屏幕。开始屏幕有4个按钮,包括播放、选项、信用和退出。如果你按Play,另一个JButton将出现,新游戏

我不希望这样,当你按下“新建游戏”按钮时,开始屏幕消失,游戏开始(实际游戏和开始屏幕都会扩展
JComponent

我有一个单独的类来运行游戏和处理游戏中的选项菜单

在starting screen类中,我有一个名为startName的
布尔值,该布尔值默认等于false,当您按下New Game按钮时,它将等于true。在开始菜单类中,我还有一个公共方法,返回startName的值,如下所示

public boolean checkGame(){
    return startGame;
}
if(menu.checkGame() == false){
            frame.add(menu);
        }
        Timer timer = new Timer(5, new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(menu.checkGame() == true){
                    frame.remove(menu);
                    frame.add(new Level1());
                }
            }
        });
        timer.start();
在运行游戏的主类中,我使用这样的计时器检查checkGame方法是否等于true或false

public boolean checkGame(){
    return startGame;
}
if(menu.checkGame() == false){
            frame.add(menu);
        }
        Timer timer = new Timer(5, new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(menu.checkGame() == true){
                    frame.remove(menu);
                    frame.add(new Level1());
                }
            }
        });
        timer.start();

显然,这是行不通的,因为如果这样,我就不会问这个问题了。那么现在我的问题是,我如何使它像我想要的那样工作?

在您的第二个代码片段中,
计时器只运行一次任务。您可能希望一个
ScheduledExecutorService
重复检查,例如:

    final ScheduledExecutorService scheduledExecutor =
            Executors.newSingleThreadScheduledExecutor();

    scheduledExecutor.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    if (menu.checkGame()) {
                        frame.remove(menu);
                        frame.add(new Level1());
                        scheduledExecutor.shutdown();
                    }
                }
            });
        }
    }, 5, 5, TimeUnit.MILLISECONDS);

为什么不让所有组件都运行,但在调用之前隐藏它们的可见性。您在
计时器中的
ActionListener
,为什么不将StartName按钮的
ActionListener
设置为@kuporific?因为以后如果我这样做会更方便way@Tdorno“这不会让游戏运行得更慢吗?”MysticKiller98我会的,但你不会注意到的