JavaFX 응용 프로그램에 카운터를 구현하고 싶습니다. 동작은 단순히 버튼을 통해 제어된다 :다른 스레드에서 카운트 다운 제어
먼저 버튼은 사용자가 클릭 한 후 카운트 다운이 10, 9, 8, ...,- 카운트 다운 중에 버튼, 카운트 다운이 사용자가 카운트 다운 동안 10
에 의해 시작 다시 카운트 다운을 실행할 수 있어야합니다 2. 후
올바른 방법으로 수행한다면 내 소스 코드를 살펴볼 수 있습니까? 특히 또는 CountdownView
에 Platform.runLater
항목을 사용해야하며 간단한 Java Thread
을 사용할 수 있습니까? 아니면 JavaFX Service
/Task
클래스를 사용해야합니까? 어떤 제안이라도 환영합니다.
CountdownTest
: 자바 FX를 스테이지를 생성하고 시작)CountdownView
:응용 프로그램이 3 개 요소로 나누어 져 싱글, 간단한 버튼이 포함은
CountdownController
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;
}
}
,
참조 http://codeReview.stackexchange.com –
JB Nizet에게 감사드립니다. 다음 번에는 _codereview.stackexchange_를 염두에 두겠습니다. – Vertex