【发布时间】: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/…
-
谢谢!我会读一读。