2012-06-14 57 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; 
     } 
    }