如何在java fx中每2秒更新一次标签框?

我试图在应用程序GUI中模拟一个基本的恒温器。

我想用新的温度值每2秒更新一次标签框值。

例如,我的初始温度将显示为68度,并更新为69到70,等等,每2秒钟75。

这是我在Java fx中编写的一段代码。 controlpanel面板是标签框存在的forms的对象。 它只更新最终值为75.它不会每2秒更新一次。 我写了一个方法暂停,导致2秒的延迟。 所有标签都更新为最终值,但不会每2秒更新一次。 当我debugging时,我可以看到值每2秒增加一个。 这段代码是用onClick事件写的

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int i=0; Timer asd = new Timer(1000,null); asd.setDelay(1000); while(i < 10) { jTextField1.setText(Integer.toString(i)); i++; asd.start(); } } 

要使用Timer解决您的任务,您需要使用您的代码实现TimerTask ,并使用Timer#scheduleAtFixedRate方法重复运行该代码:

 Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.print("I would be called every 2 seconds"); } }, 0, 2000); 

另外请注意,调用任何UI操作必须在Swing UI线程上完成(或者如果您使用的是JavaFX,则为FX UI线程):

 private int i = 0; private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { jTextField1.setText(Integer.toString(i++)); } }); } }, 0, 2000); } 

在JavaFX的情况下,您需要更新“FX UI线程”上的FX控件而不是Swing中的一个。 要实现那个使用javafx.application.Platform#runLater方法而不是SwingUtilities

这是一个替代scheme,它使用JavaFXanimation时间轴而不是定时器。

我喜欢这个解决scheme,因为animation框架可以确保所有事情都发生在JavaFX应用程序线程上,所以您不必担心线程问题。

温度探头

 import javafx.animation.*; import javafx.application.Application; import javafx.beans.binding.Bindings; import javafx.beans.property.*; import javafx.event.*; import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.util.Duration; import java.util.Random; public class ThermostatApp extends Application { @Override public void start(final Stage stage) throws Exception { final Thermostat thermostat = new Thermostat(); final TemperatureLabel temperatureLabel = new TemperatureLabel(thermostat); VBox layout = new VBox(10); layout.getChildren().addAll(temperatureLabel); layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 20; -fx-font-size: 20;"); stage.setScene(new Scene(layout)); stage.show(); } public static void main(String[] args) throws Exception { launch(args); } } class TemperatureLabel extends Label { public TemperatureLabel(final Thermostat thermostat) { textProperty().bind( Bindings.format( "%3d \u00B0F", thermostat.temperatureProperty() ) ); } } class Thermostat { private static final Duration PROBE_FREQUENCY = Duration.seconds(2); private final ReadOnlyIntegerWrapper temperature; private final TemperatureProbe probe; private final Timeline timeline; public ReadOnlyIntegerProperty temperatureProperty() { return temperature.getReadOnlyProperty(); } public Thermostat() { probe = new TemperatureProbe(); temperature = new ReadOnlyIntegerWrapper(probe.readTemperature()); timeline = new Timeline( new KeyFrame( Duration.ZERO, new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { temperature.set(probe.readTemperature()); } } ), new KeyFrame( PROBE_FREQUENCY ) ); timeline.setCycleCount(Timeline.INDEFINITE); timeline.play(); } } class TemperatureProbe { private static final Random random = new Random(); public int readTemperature() { return 72 + random.nextInt(6); } } 

该解决scheme基于倒计时器解决scheme: JavaFX:如何绑定两个值?