Обновлять графический интерфейс JavaFX 2 через определенные промежутки времени?

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

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

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

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

Спасибо за любой отзыв по этому поводу.


person daru    schedule 14.06.2012    source источник
comment
В вашем подходе нет ничего плохого. Хотя в JavaFX есть немного вспомогательного API, вы можете найти учебник здесь: docs.oracle.com/javafx/2/threads/jfxpub-threads.htm   -  person Sergey Grinev    schedule 15.06.2012


Ответы (1)


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

Вы также можете прочитать о 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;
         }
     }
person Tomasz Przybylski    schedule 18.06.2014