2012-06-14 2 views
1

Я провел как последние 24 часа, пытаясь выучить JavaFX. Я пытаюсь создать графический интерфейс, который будет отображать значения из источника данных (например, базы данных). Мой вопрос заключается в том, что это лучший способ сделать это. До сих пор я придумал этот код, чтобы создать простой графический интерфейс и получить некоторые данные из источника данных:Обновите графический интерфейс JavaFX 2 через определенные промежутки времени?

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

Datasource:

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, насколько мне известно. Но является ли это жизнеспособным решением?

Следующим шагом является замена текста на значение из источника данных. Посмотрите на коллекции и ObservableMap и задаетесь вопросом, является ли это предпочтительным способом обновления фактических GUI? Я учусь о некоторых проблемах с внутренними классами и конечными переменными, но могу предположить, что после некоторого сна.

Кроме того, целевая машина не настолько мощная (где-то между 350-512 МБ ОЗУ). Может ли это быть проблемой? До сих пор мои простые тесты работают нормально.

Благодарим вас за отзыв.

+1

Там нет ничего плохого с вашим подходом. Хотя в JavaFX есть немного полезного API, вы можете найти учебник здесь: http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm –

ответ

-1

This Oracle example показывает, как добиться загрузки параллелизма в таблице данных с исходным кодом; это может помочь вам

Вы также можете прочитать о API javafx.concurrent.Task<V>.

Код на примере 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; 
     } 
    } 
Смежные вопросы