如何在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:如何绑定两个值?
- Java 8 Streams – 收集vs减less
- Spring MVC Controller使用URL参数进行redirect,而不是作为响应
- Android的FragmentManager的BackStackRecord.run抛出NullPointerException
- 我可以在同一个catch子句中捕获多个Javaexception吗?
- debuggingjdk源码不能监视variables是什么
- 将java.util.Date转换为什么“java.time”types?
- 为什么要在java中的for-each循环内声明所需的variables
- 寻求澄清弱types语言的明显矛盾
- 将string转换为Java中的日历对象