2012-06-14 59 views
1

我花了最近24小时试图学习JavaFX。我试图构建一个GUI来显示数据源的值(例如数据库)。我的问题是这样做的首选方式。到目前为止,我想出了这个代码来构建一个简单的GUI,并从数据源中的一些数据:间隔更新JavaFX 2 GUI?

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; 
    } 
} 

100毫秒是OK的时间间隔来更新这个就我而言,GUI。但这是一个可行的解决方案吗?

下一步是用来自数据源的值替换文本。一直在观察Collections和ObservableMap并想知道这是否是实际GUI更新的首选方式?我在内部类和最终变量方面遇到了一些问题,但是可能会在睡眠后引发这些问题。另外,目标机器功能不是很强大(大约在350-512 MB RAM之间)。这可能是一个问题吗?到目前为止,我的简单测试似乎运行良好。

谢谢你对此的任何反馈。

+1

没有什么错你的方法。尽管JavaFX中有一些帮助API,但您可以在这里找到教程:http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm –

回答

-1

This Oracle example显示了如何使用源代码实现数据表中的并发加载;它可能会帮助你

你也可以看看关于javafx.concurrent.Task<V> 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; 
     } 
    }