JavaFXGUI记分板
我试图用JavaFX制作一个基本的GUI记分板,但在程序中遇到了一个错误JavaFXGUI记分板,java,javafx,Java,Javafx,我试图用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;
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));
}
}
包应用;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
公共类计数器扩展应用程序{
公共int P1_分数=0;
公共int P2_分数=0;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
//垂直盒
VBox vertBox=新的VBox();
vertBox.setPrefSize(400400);
垂直箱设置对齐(位置中心);
//为运动员准备的水平箱子
HBox PlayerName=新的HBox();
PlayerName.setAlignment(位置中心);
PlayerName.setPadding(新插图(25,25,25,25));
//分数的水平框
HBox分数=新的HBox();
得分。设置对齐(位置中心);
//显示目标的水平框
HBox目标=新HBox();
目标设置对齐(位置中心);
//player1名称
Label team1=新标签(“玩家1”);
团队1.setTextFill(颜色:红色);
第1组:设置对齐(位置左上方);
团队1.设置填充(新插图(25,25,25,25));
//player2名称
Label team2=新标签(“玩家2”);
团队2.setTextFill(颜色:蓝色);
第2组:设置对齐(右上方);
团队2.设置填充(新插图(25,25,25,25));
//球员1分
标签文本1=新标签();
text 1.设置对齐(位置居中左);
text1.setText(整数.toString(P1_分数));
text1.设置填充(新插图(25,30,50,25));
//球员2分
标签文本2=新标签();
text 2.设置对齐(位置居中\右侧);
text2.setText(整数.toString(P2_分数));
text2.设置填充(新插图(25,30,50,25));
//球员1号进球
按钮btn1=新按钮(“玩家1分”);
btn1.设置对齐(位置底部左);
btn1.设置填充(新插图(10,10,10,10));
//球员2进球
按钮btn2=新按钮(“玩家2分数”);
btn2.设置填充(新插图(10,10,10,10));
btn2.设置对齐(位置底部\右侧);
//运动员1号球门事件
btn1.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent arg0){
//加分
P1_分数=P1_分数+1;
//显示player1分数
text1.setText(整数.toString(P1_分数));
如果(P1_分数=3){
重置分数(文本1、文本2);
}
}
});
//运动员2号球门事件
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent arg0){
//增加玩家2的分数
P2_分数=P2_分数+1;
//显示分数
text2.setText(整数.toString(P2_分数));
如果(P2_分数==3){
重置分数(文本1、文本2);
}
}
});
PlayerName.getChildren().addAll(team1,team2);
Score.getChildren().addAll(text1,text2);
Goal.getChildren().addAll(btn1、btn2);
getChildren().addAll(PlayerName、Score、Goal);
初级阶段。设置标题(“计数器”);
场景=新场景(顶点框);
初级阶段。场景(场景);
primaryStage.show();
}
私有无效重置分数(标签文本1、标签文本2){
试一试{
《睡眠》(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
P1_得分=0;
P2_得分=0;
text1.setText(整数.toString(P1_分数));
text2.setText(整数.toString(P2_分数));
}
}
该代码应该是一个基本记分板的模拟。当任何一名球员攻入三球时,记分板模拟应显示两秒钟的最终得分,然后重置为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();
}
}
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();
}