Javafx 2 每隔一段时间更新JavaFX2GUI?
在过去的24小时里,我一直在努力学习JavaFX。我正在尝试构建一个GUI,它将显示来自数据源(例如数据库)的值。我的问题是这样做的首选方式是什么。到目前为止,我已经编写了以下代码来构建一个简单的GUI,并从数据源获取一些数据:Javafx 2 每隔一段时间更新JavaFX2GUI?,javafx-2,Javafx 2,在过去的24小时里,我一直在努力学习JavaFX。我正在尝试构建一个GUI,它将显示来自数据源(例如数据库)的值。我的问题是这样做的首选方式是什么。到目前为止,我已经编写了以下代码来构建一个简单的GUI,并从数据源获取一些数据: import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Group; import javafx.scene.Scene; import
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class AvcHmi extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Text t = new Text(10, 50, "Replace/update this text periodically with data");
Group root = new Group();
root.getChildren().add(t);
primaryStage.setScene(new Scene(root, 400, 300));
primaryStage.show();
new Thread() {
private DataSource dataSource = new DataSource();
{ setDaemon(true); }
@Override
public void run() {
try {
for(;;) {
Thread.sleep(100);
Platform.runLater(new Runnable() {
@Override
public void run() {
System.out.println(dataSource.getDataMap().get("key1"));
}});
}
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}
数据源:
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class DataSource {
Map<String,String> dataMap = new HashMap<>();
public DataSource() {
dataMap.put("key1", "value1");
dataMap.put("key2", "value2");
dataMap.put("key3", "value3");
}
public Map<String, String> getDataMap() {
Random generator = new Random();
int randInt = generator.nextInt();
dataMap.put("key1", "value"+randInt);
return dataMap;
}
}
import java.util.HashMap;
导入java.util.Map;
导入java.util.Random;
公共类数据源{
Map dataMap=newhashmap();
公共数据源(){
dataMap.put(“键1”、“值1”);
dataMap.put(“键2”、“值2”);
dataMap.put(“键3”、“值3”);
}
公共映射getDataMap(){
随机生成器=新随机();
int randInt=generator.nextInt();
dataMap.put(“键1”、“值”+randInt);
返回数据图;
}
}
就我而言,100毫秒是更新这个GUI的好时间间隔。但这是一个可行的解决方案吗
下一步是用数据源中的值替换文本。一直在研究集合和ObservableMap,想知道这是否是进行实际GUI更新的首选方法?我在内部类和最终变量方面遇到了一些问题,但可能会在睡眠后解决
此外,目标机器的功能也没有那么强大(内存在350-512 mb之间)。这可能是个问题吗?到目前为止,我的简单测试似乎运行良好
感谢您对此的反馈。展示了如何通过源代码在数据表中实现并发加载;这可能对你有帮助
您还可以阅读关于javafx.concurrent.Task
API的阅读
Oracle示例上的代码如下所示:
public class UpdateCustomerTask extends Task<Customer> {
private final Customer customer;
public UpdateCustomerTask(Customer customer) {
this.customer = customer;
}
@Override protected Customer call() throws Exception {
// pseudo-code:
// query the database
// read the values
// Now update the customer
Platform.runLater(new Runnable() {
@Override public void run() {
customer.setF setFirstName(rs.getString("FirstName"));
// etc
}
});
return customer;
}
}
public类UpdateCustomerTask扩展了任务{
私人最终客户;
公共UpdateCustomerTask(客户){
this.customer=customer;
}
@重写受保护的客户调用()引发异常{
//伪代码:
//查询数据库
//读取值
//现在更新客户
Platform.runLater(新的Runnable(){
@重写公共无效运行(){
customer.setF setFirstName(rs.getString(“FirstName”);
//等
}
});
退货客户;
}
}
您的方法没有问题。尽管JavaFX中有一些帮助API,但您可以在这里找到教程: