如何在JavaFX中使代码定期刷新?
我正在尝试创建一个时钟程序,我是javaFX编程新手,我的代码如下所示:如何在JavaFX中使代码定期刷新?,java,animation,javafx,clock,Java,Animation,Javafx,Clock,我正在尝试创建一个时钟程序,我是javaFX编程新手,我的代码如下所示: package clock; import java.util.Calendar; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.Timeline; import javafx.application.Application; import javafx.scene.Scene; im
package clock;
import java.util.Calendar;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.effect.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Duration;
/**
*
* @author Jaskey */
public class Clock extends Application {
/**
* @param args the command line arguments
*/
private ImageView secondHand;
private ImageView minuteHand;
private ImageView hourHand;
private Calendar realTime = Calendar.getInstance();
int hours = realTime.get(Calendar.HOUR_OF_DAY);
int minutes = realTime.get(Calendar.MINUTE);
int seconds = realTime.get(Calendar.SECOND);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Clock 0.03");
primaryStage.initStyle(StageStyle.TRANSPARENT);
Circle clock = new Circle(150,Color.DARKGRAY);
clock.setEffect(new Glow(0.6f));
clock.setEffect(new InnerShadow(15, Color.BEIGE));
clock.setEffect(new DropShadow());
Circle clockCentre = new Circle(7,Color.THISTLE);
clockCentre.setEffect(new Shadow());
clockCentre.setEffect(new BoxBlur());
minuteHand = new ImageView(new Image(Clock.class.getResourceAsStream("images/minuteHand.png")));
minuteHand.setFitHeight(370);
minuteHand.setFitWidth(370);
minuteHand.setOpacity(0.85f);
secondHand = new ImageView(new Image(Clock.class.getResourceAsStream("images/secondHand.png")));
secondHand.setFitHeight(370);
secondHand.setFitWidth(370);
secondHand.setOpacity(0.85f);
hourHand = new ImageView(new Image(Clock.class.getResourceAsStream("images/hourHand.png")));
hourHand.setFitHeight(370);
hourHand.setFitWidth(370);
hourHand.setOpacity(0.85f);
if(seconds == seconds){
secondHand.setRotate(seconds*6);
}
if(minutes == minutes){
minuteHand.setRotate(minutes*6);
}
if(hours == hours){
hourHand.setRotate(hours*30);
}
final Timeline timelineSeconds = new Timeline();
timelineSeconds.setCycleCount(Timeline.INDEFINITE);
timelineSeconds.setAutoReverse(false);
final KeyValue SecondHand = new KeyValue(secondHand.rotateProperty(), 360);
final KeyFrame seconds2 = new KeyFrame(Duration.seconds(60), SecondHand);
timelineSeconds.getKeyFrames().addAll(seconds2);
timelineSeconds.play();
final Timeline timelineMinutes = new Timeline();
timelineMinutes.setCycleCount(Timeline.INDEFINITE);
timelineMinutes.setAutoReverse(false);
final KeyValue MinuteHand = new KeyValue(minuteHand.rotateProperty(), 360);
final KeyFrame minutes2 = new KeyFrame(Duration.minutes(60), MinuteHand);
timelineMinutes.getKeyFrames().add(minutes2);
timelineMinutes.play();
final Timeline timelineHours = new Timeline();
timelineHours.setCycleCount(Timeline.INDEFINITE);
timelineHours.setAutoReverse(false);
final KeyValue HourHand = new KeyValue(hourHand.rotateProperty(), 360);
final KeyFrame hours2 = new KeyFrame(Duration.hours(12), HourHand);
timelineHours.getKeyFrames().add(hours2);
timelineHours.play();
StackPane root = new StackPane();
root.getChildren().addAll(clock, clockCentre, hourHand, minuteHand, secondHand);
Scene myScene = new Scene(root, 650, 450);
myScene.setFill(null);
primaryStage.setScene((myScene));
primaryStage.show();
}
}
时钟指针工作正常(只是与当前时间不同步),因此我添加了这部分代码来解决问题:
if(seconds == seconds){
secondHand.setRotate(seconds*6);
}
if(minutes == minutes){
minuteHand.setRotate(minutes*6);
}
if(hours == hours){
hourHand.setRotate(hours*30);
}
唯一的问题是,每一分钟,秒针都会震动,每一小时,每半天,秒针都会震动。我知道问题的解决办法在于每59秒刷新一次上面的代码-这就是我需要帮助的地方-我如何使它每59秒刷新一次
谢谢…您可以在JavaFX中找到3个基本上可以操纵时间顺序的类。其中我们有、、和。它们一起工作,成为JavaFX动画的基本API的扩展(另一部分保留用于转换)。除此之外,您还会发现一个与Swing Timer类非常相似的类,称为 您可以正确地学习如何正确使用所有这些类 我建议你读这篇文章。阅读时,请查看其中提到的每个类的文档。迟早你会完全明白如何使用它们 首先,我想到可以开始60秒的动画,更新时钟的秒数。此动画将无限期运行。动画完成后,使用动画结束时生成的事件更新时钟的其他部分。通过此更新,您可以触发其他动画,只需更新分钟和小时 让我们明确这不是一个最终的想法。我只是给你提一些建议,你会及时发现制造手表的最佳方法。当你读完我给你的链接后,再看看我的想法,然后开始想出一个策略,只在需要时管理更新和动画。在代码中,您所做的只是将节点属性连接到动画对象,然后点击“播放按钮”。不要这样做。当秒过去或发生了什么事情时,让你的时钟同步运行(明白了吗?) 如果您还有问题,请在此处发表评论,我将帮助您。:) 祝你好运