내 프로그램에는 9 개의 카운트 다운 타이머가 필요합니다. 타이머는 사용자가 시작합니다. 내 구현에서는 시작된 각 타이머에 대한 타이머 클래스를 만듭니다. timerclass는 타임 라인을 사용합니다. 타이머의 시작에 따라 초는 비동기입니다.
진행 방법을 잘 모르겠습니다.
첫 번째 생각은 모든 카운트 다운에 하나의 타임 라인 만 사용하는 것이 었습니다. 모든 stringProperties를 목록에 넣으면 타임 라인이 속성을 변경합니다. 이것이 좋은 방법인지 잘 모르겠습니까?
일부 Google에서는 이러한 문제에 사용할 수있는 animationtimer가 있음을 알았습니다. 그러나 나는 예를 이해할 수 없었다. 핸들 메서드를 덮어 써야합니다. 이것으로 타이머를 어떻게 업데이트해야합니까?
아이디어는 옳습니다. PauseTransition
또는 TimeLine
(1) 과 같은 하나의 애니메이션 도구를 사용 하여 다음 MRE에 설명 된대로 모든 카운터를 업데이트합니다 .
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
public class SyncedCounters extends Application {
private static final int MAX_COUNT = 100;
private Map<Label, Integer> counters;
private VBox countersPane;
@Override public void start(Stage stage) throws IOException {
counters = new HashMap<>();
countersPane = new VBox();
Button addCounter = new Button("Add Counter");
addCounter.setOnAction(e->addCounter());
BorderPane root = new BorderPane(countersPane, null, null, null, addCounter);
stage.setScene(new Scene(new ScrollPane(root),250,200));
stage.show();
update();
}
private void update() {
PauseTransition pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(event ->{
updateCounters();
pause.play();
});
pause.play();
}
private void addCounter() {
Label label = new Label(String.valueOf(MAX_COUNT));
label.setAlignment(Pos.CENTER);
label.setPrefSize(150, 25);
counters.put(label, MAX_COUNT);
countersPane.getChildren().add(label);
}
private void updateCounters() {
for(Label l : counters.keySet()){
int counterValue = counters.get(l);
if(counterValue > 0 ){
counterValue--;
l.setText(String.valueOf(counterValue));
counters.put(l, counterValue);
}
}
}
public static void main(String[] args) {
launch(args);
}
}
TimeLine
으로 PauseTransition
변경 하는 대신 사용하려면 update()
:
void update() {
Timeline timeline = new Timeline();
timeline.setCycleCount(Animation.INDEFINITE);
KeyFrame keyFrame = new KeyFrame(
Duration.seconds(1),
event -> {updateCounters();}
);
timeline.stop();
timeline.getKeyFrames().clear();
timeline.getKeyFrames().add(keyFrame);
timeline.play();
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다