【问题标题】:JavaFX program is hanging up with no errors and isn't changing background colorJavaFX 程序挂断,没有错误,也没有改变背景颜色
【发布时间】:2017-03-14 04:08:08
【问题描述】:

我是 JavaFX 的新手,我们的老师给我们布置的作业比我们所教的要复杂得多。我已经构建了所有的界面和逻辑,但是我的程序挂了,我不知道为什么,它使它超过了睡眠阶段。任何人都可以帮忙吗? 更新:我发现 while 循环无限运行并冻结程序。有没有办法让它通过事件监听器停止程序?

package assign3;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Question2 extends Application
{
    private boolean runGame = true;
    private int level = 1;
    public static final int RED = 1;
    public static final int GREEN = 2;
    public static final int BLUE = 3;
    public static final int ORANGE = 4;
    private static BorderPane obBorder = new BorderPane();
    private static HBox obPane = new HBox();
    private static HBox obStart = new HBox();
    private static Button btRed = new Button("Red");
    private static Button btGreen = new Button("Green");
    private static Button btBlue = new Button("Blue");
    private static Button btOrange = new Button("Orange");
    private static Button btStart = new Button("Start");

    @Override
    public void start( Stage obPrimeStage ) throws Exception
    {        
        obStart.getChildren().add(btStart);
        obPane.getChildren().addAll(btRed, btGreen, btBlue, btOrange);

        obBorder.setCenter(obPane);
        obBorder.setBottom(obStart);
        obPane.setAlignment(Pos.CENTER);
        obStart.setAlignment(Pos.CENTER);

        Scene obScene = new Scene(obBorder, 400, 400);

        obPrimeStage.setTitle("Question 2");
        obPrimeStage.setScene(obScene);
        obPrimeStage.show();

        btStart.setOnAction((ActionEvent start) -> {
            try {
                runGame();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });       
    }


    private void runGame() throws InterruptedException
    {
        int randomColour;

        do{
            ArrayList<Integer> colours = new ArrayList<>();
            ArrayList<Integer> guesses = new ArrayList<>();
            for(int i = 0; i <= level; i++)
            {
                //randomColour = (int)((Math.random() * 4) + 1);
                randomColour = 1;

                if(randomColour == RED)
                {
                    obBorder.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println("Wake up plz");
                    obBorder.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)));
                    colours.add(RED);
                }
                else if(randomColour == BLUE)
                {
                    obBorder.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
                    TimeUnit.SECONDS.sleep(1);
                    obBorder.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)));
                    colours.add(BLUE);
                }
                else if(randomColour == GREEN)
                {
                    obBorder.setBackground(new Background(new BackgroundFill(Color.GREEN, CornerRadii.EMPTY, Insets.EMPTY)));
                    TimeUnit.SECONDS.sleep(1);
                    obBorder.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)));
                    colours.add(GREEN);
                }
                else if(randomColour == ORANGE)
                {
                    obBorder.setBackground(new Background(new BackgroundFill(Color.ORANGE, CornerRadii.EMPTY, Insets.EMPTY)));
                    TimeUnit.SECONDS.sleep(1);
                    obBorder.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)));
                    colours.add(GREEN);
                }

                while(guesses.size() < colours.size())
                {
                    btRed.setOnAction((ActionEvent e) -> 
                    {
                        obBorder.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
                        guesses.add(RED);
                    });

                    btGreen.setOnAction((ActionEvent e) -> 
                    {
                        obBorder.setBackground(new Background(new BackgroundFill(Color.GREEN, CornerRadii.EMPTY, Insets.EMPTY)));
                        guesses.add(GREEN);
                    });

                    btBlue.setOnAction((ActionEvent e) -> 
                    {
                        obBorder.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
                        guesses.add(BLUE);
                    });

                    btOrange.setOnAction((ActionEvent e) -> 
                    {
                        obBorder.setBackground(new Background(new BackgroundFill(Color.ORANGE, CornerRadii.EMPTY, Insets.EMPTY)));
                        guesses.add(ORANGE);
                    });
                }

                for(int j = 0; j < colours.size(); j++)
                {
                    if(guesses.get(j) != colours.get(j))
                    {
                        runGame = false;
                    }
                    if(runGame)
                    {
                        level += 1;
                    }
                }
            }

        }while(runGame);
    }  

    public static void main( String[] args )
    {
        Application.launch(args);

    }
}

【问题讨论】:

  • 永远不要将事件处理程序放在循环中,除非动态创建节点并且您想向节点添加事件处理程序。可能还有其他例外。此外,您似乎在程序的主线程中运行了一个 while(true) 循环。这将导致程序冻结。您需要了解 JavaFx Animation 类和游戏循环。这是一个很棒的教程:gamedevelopment.tutsplus.com/tutorials/…
  • 谢谢!我会读一读。

标签: java eclipse javafx


【解决方案1】:

鉴于 Sedrick 的评论和对我的导师的质疑,我意识到这一切都可以通过仅通过事件处理程序运行我的程序来更好地处理。 JavaFX 迭代中的循环无法正常工作,不应实现。

我必须在 btStart ActionEvent 上运行我的第一次迭代,其余的则通过其他按钮上的用户单击事件来运行。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2017-11-17
    • 2021-07-14
    • 2021-04-08
    • 2015-10-29
    相关资源
    最近更新 更多