gpt4 book ai didi

java - 从另一个线程控制倒计时

转载 作者:行者123 更新时间:2023-12-01 15:00:59 25 4
gpt4 key购买 nike

我想在我的 JavaFX 应用程序中实现一个计数器。该行为只需通过按钮进行控制:

  1. 当用户首先点击按钮时,倒计时开始倒计时 10, 9, 8, ..., 0
  2. 当用户在倒计时期间点击按钮时,倒计时应该取消
  3. 2. 之后,用户应该能够再次从 10 开始倒计时

在倒计时期间,会处理一些繁重的数学计算(在我的应用程序音频分析中)。

如果我以正确的方式做的话,你能看一下我的源代码吗?特别是我应该在 CountdownControllerCountdownView 中执行 Platform.runLater 操作,我可以使用简单的 Java Thread 或者我应该使用 JavaFX Service/Task 类?欢迎提出任何建议。

该应用程序分为 3 个组件:

  1. CountdownTest:创建舞台并启动 JavaFX)
  2. CountdownView:单例,包含一个简单的Button,将按钮事件传递给CountdownController
  3. CountdownController:单例,启动一个新的Thread。在 Thread 内执行倒计时,更新 CountdownView 以显示新的倒计时状态,并处理一些数学内容。

CountdownTest.java

package org.example;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class CountdownTest extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
final Group root = new Group();
final Scene scene = new Scene(root);
root.getChildren().setAll(CountdownView.getInstance());
primaryStage.setScene(scene);
primaryStage.show();
}

@Override
public void stop() throws Exception {
super.stop();
CountdownController.getInstance().stop();
}

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

CountdownView.java

package org.example;

import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.Tooltip;
import javafx.scene.input.MouseEvent;

public final class CountdownView extends Group {
private static final CountdownView instance = new CountdownView();

private Button start;

private CountdownView() {
start = new Button("Start");
start.setTooltip(new Tooltip("click to start countdown"));
start.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
CountdownController.getInstance().onStartClick();
}
});

this.getChildren().setAll(start);
}

public void startCountdown() {
System.out.println("startCountdown");
start.setTooltip(new Tooltip("click to stop countdown"));
}

public void setCountdown(final int countdown) {
System.out.println("setCountdown " + countdown);
start.setText(String.valueOf(countdown));
}

public void reset() {
System.out.println("reset");
start.setText("Start");
start.setTooltip(new Tooltip("click to start countdown"));
}

public static CountdownView getInstance() {
return instance;
}
}

CountdownController.java

package org.example;

import javafx.application.Platform;

public final class CountdownController {
private static final CountdownController instance = new CountdownController();

private Thread countdownThread;
private volatile boolean running = false;

public void onStartClick() {
if (!running) {
countdownThread = new Thread(new Runnable() {
@Override
public void run() {
running = true;
int countdown = 10;
Platform.runLater(new Runnable() {
@Override
public void run() {
CountdownView.getInstance().startCountdown();
CountdownView.getInstance().setCountdown(10);
}
});
final long start = System.currentTimeMillis();
int lastCountdown = countdown;
while (!Thread.interrupted() && countdown > 0) {
countdown = (int) (10 - (System.currentTimeMillis() - start) / 1000);
if (countdown != lastCountdown) {
lastCountdown = countdown;
final int currentCountdown = countdown;
Platform.runLater(new Runnable() {
@Override
public void run() {
CountdownView.getInstance().setCountdown(
currentCountdown);
}
});
}

// Do some heavy computing stuff
for (int i = 0; i < 10000000; i++) {
Math.sin(Math.random());
}
}
running = false;
Platform.runLater(new Runnable() {
@Override
public void run() {
CountdownView.getInstance().reset();
}
});
}
});
countdownThread.start();
} else {
countdownThread.interrupt();
}
}

public void stop() {
if (countdownThread != null) {
System.out.println("stop");
countdownThread.interrupt();
}
}

public static CountdownController getInstance() {
return instance;
}
}

最佳答案

别出太多汗。任务和服务类只是在执行器上构建的一些实用程序,如果您不需要它们提供的功能,那么这只是额外的工作。

我认为您使用 Controller 来决定应该在哪个线程上运行是正确的,您的 View 足以在组件和 Controller 之间路由消息。

关于java - 从另一个线程控制倒计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com