- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正尝试在 JavaFX 中制作一个基本的 GUI 记分牌,但在程序中遇到错误。
package application;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Counter extends Application {
public int P1_Score = 0;
public int P2_Score = 0;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// vertical box
VBox vertBox = new VBox();
vertBox.setPrefSize(400, 400);
vertBox.setAlignment(Pos.CENTER);
// horizontal box for the players
HBox PlayerName = new HBox();
PlayerName.setAlignment(Pos.CENTER);
PlayerName.setPadding(new Insets(25, 25, 25, 25));
// horizontal box for the scores
HBox Score = new HBox();
Score.setAlignment(Pos.CENTER);
// horizontal box to show a goal
HBox Goal = new HBox();
Goal.setAlignment(Pos.CENTER);
// player1 name
Label team1 = new Label("Player 1");
team1.setTextFill(Color.RED);
team1.setAlignment(Pos.TOP_LEFT);
team1.setPadding(new Insets(25, 25, 25, 25));
// player2 name
Label team2 = new Label("Player 2");
team2.setTextFill(Color.BLUE);
team2.setAlignment(Pos.TOP_RIGHT);
team2.setPadding(new Insets(25, 25, 25, 25));
// player1 score
Label text1 = new Label();
text1.setAlignment(Pos.CENTER_LEFT);
text1.setText(Integer.toString(P1_Score));
text1.setPadding(new Insets(25, 30, 50, 25));
// player2 score
Label text2 = new Label();
text2.setAlignment(Pos.CENTER_RIGHT);
text2.setText(Integer.toString(P2_Score));
text2.setPadding(new Insets(25, 30, 50, 25));
// player1 goal
Button btn1 = new Button("Player 1 score");
btn1.setAlignment(Pos.BOTTOM_LEFT);
btn1.setPadding(new Insets(10, 10, 10, 10));
// player2 goal
Button btn2 = new Button("Player 2 score");
btn2.setPadding(new Insets(10, 10, 10, 10));
btn2.setAlignment(Pos.BOTTOM_RIGHT);
// event for player1 goal
btn1.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
// increase score
P1_Score = P1_Score + 1;
// display player1 score
text1.setText(Integer.toString(P1_Score));
if (P1_Score == 3) {
resetScore(text1, text2);
}
}
});
// event for player2 goal
btn2.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
// increase player2 score
P2_Score = P2_Score + 1;
// display score
text2.setText(Integer.toString(P2_Score));
if (P2_Score == 3) {
resetScore(text1, text2);
}
}
});
PlayerName.getChildren().addAll(team1, team2);
Score.getChildren().addAll(text1, text2);
Goal.getChildren().addAll(btn1, btn2);
vertBox.getChildren().addAll(PlayerName, Score, Goal);
primaryStage.setTitle("Counter");
Scene scene = new Scene(vertBox);
primaryStage.setScene(scene);
primaryStage.show();
}
private void resetScore(Label text1, Label text2) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
P1_Score = 0;
P2_Score = 0;
text1.setText(Integer.toString(P1_Score));
text2.setText(Integer.toString(P2_Score));
}
}
该代码应该是对基本记分牌的模拟。当任一球员进三球时,记分牌模拟应显示最终比分两秒钟,然后重置为 0-0。
目前,程序会在分数等于 3 时卡住,但分数不会更新。如果比分是 2-1,球员 1 进了两个球,他们进了第三个球,屏幕卡住在 2-1 并重置。如何让比分显示第三个进球然后重置。谢谢。
最佳答案
您不应该使用 Thread.Sleep();
阻塞 JavaFx 应用程序线程(与 swing 相同),因此使用 javafx.concurrent.Task
来实现您的目标
引用下面更新的代码,
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
public class JavaFXApplication4 extends Application {
public int P1_Score = 0;
public int P2_Score = 0;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// vertical box
VBox vertBox = new VBox();
vertBox.setPrefSize(400, 400);
vertBox.setAlignment(Pos.CENTER);
// horizontal box for the players
HBox PlayerName = new HBox();
PlayerName.setAlignment(Pos.CENTER);
PlayerName.setPadding(new Insets(25, 25, 25, 25));
// horizontal box for the scores
HBox Score = new HBox();
Score.setAlignment(Pos.CENTER);
// horizontal box to show a goal
HBox Goal = new HBox();
Goal.setAlignment(Pos.CENTER);
// player1 name
Label team1 = new Label("Player 1");
team1.setTextFill(Color.RED);
team1.setAlignment(Pos.TOP_LEFT);
team1.setPadding(new Insets(25, 25, 25, 25));
// player2 name
Label team2 = new Label("Player 2");
team2.setTextFill(Color.BLUE);
team2.setAlignment(Pos.TOP_RIGHT);
team2.setPadding(new Insets(25, 25, 25, 25));
// player1 score
Label text1 = new Label();
text1.setAlignment(Pos.CENTER_LEFT);
text1.setText(Integer.toString(P1_Score));
text1.setPadding(new Insets(25, 30, 50, 25));
// player2 score
Label text2 = new Label();
text2.setAlignment(Pos.CENTER_RIGHT);
text2.setText(Integer.toString(P2_Score));
text2.setPadding(new Insets(25, 30, 50, 25));
// player1 goal
Button btn1 = new Button("Player 1 score");
btn1.setAlignment(Pos.BOTTOM_LEFT);
btn1.setPadding(new Insets(10, 10, 10, 10));
// player2 goal
Button btn2 = new Button("Player 2 score");
btn2.setPadding(new Insets(10, 10, 10, 10));
btn2.setAlignment(Pos.BOTTOM_RIGHT);
// event for player1 goal
btn1.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
if (P1_Score >= 3) { // to avoid futher Score update after 3
return;
}
// increase score
P1_Score = P1_Score + 1;
// display player1 score
text1.setText(Integer.toString(P1_Score));
if (P1_Score == 3) {
resetScore(text1, text2);
}
}
});
// event for player2 goal
btn2.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
if (P2_Score >= 3) { // to avoid futher Score update after 3
return;
}
// increase player2 score
P2_Score = P2_Score + 1;
// display score
text2.setText(Integer.toString(P2_Score));
if (P2_Score == 3) {
resetScore(text1, text2);
}
}
});
PlayerName.getChildren().addAll(team1, team2);
Score.getChildren().addAll(text1, text2);
Goal.getChildren().addAll(btn1, btn2);
vertBox.getChildren().addAll(PlayerName, Score, Goal);
primaryStage.setTitle("Counter");
Scene scene = new Scene(vertBox);
primaryStage.setScene(scene);
primaryStage.show();
}
private void resetScore(Label text1, Label text2) {
Task task = new Task() {
@Override
public Void call() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
};
task.setOnSucceeded((e) -> {
P1_Score = 0;
P2_Score = 0;
text1.setText(Integer.toString(P1_Score));
text2.setText(Integer.toString(P2_Score));
});
new Thread(task).start();
}
}
P.S 您可以使用 javafx.animation.PauseTransition
private void resetScore(Label text1, Label text2) {
PauseTransition pause = new PauseTransition(Duration.millis(2000));
pause.setOnFinished(e -> {
P1_Score = 0;
P2_Score = 0;
text1.setText(Integer.toString(P1_Score));
text2.setText(Integer.toString(P2_Score));
});
pause.play();
}
关于Javafx GUI 记分牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47425336/
我正尝试在 JavaFX 中制作一个基本的 GUI 记分牌,但在程序中遇到错误。 package application; import javafx.application.Application;
这个问题已经有答案了: php code to give the position according to their scores (1st, 2nd, 3rd, 3rd, 5th) [close
我正在为即将到来的世界杯做一个小项目。我正在建立一个基于国家队小组的名册/排行榜/记分牌。我们的想法是获得有关小组内或淘汰赛阶段所有即将到来的比赛的信息(比分、比赛时间、比赛统计数据等)。目前我被数据
我有一个带有记分牌的 WordPress 网站,可以从 wp 数据库中的 View 获取结果,并且我已经在自定义页面模板上设置了记分板。我的麻烦是将记分牌中的玩家链接到包含玩家的新页面统计数据等。我希
从昨天开始,我开始制作我的第一个插件,但出现了一些问题。我有记分牌类(class)。并且有制作记分板、加载记分板和更改分数的方法。 这里是: package eu.anavicius.TomTom19
我正在使用 C# 控制台制作俄罗斯方 block 游戏。我已经完成了游戏的大部分内容,但在文件处理方面遇到了困难。我还没有真正找到任何与此相关的东西,所以我想我可以试一试并问问它。所以我想做的是将玩家
我是一名优秀的程序员,十分优秀!