JavaFX ListChangeListener多线程

时间:2018-12-02 02:58:07

标签: java listview javafx changelistener

我正在尝试开发JavaFX应用程序以模拟某些电梯系统。

每个对象Elevator在其自己的线程上运行,我想在列表视图中显示每个Elevator.toString()。问题是,在运行应用程序一段时间后,我将从一个或多个电梯线程中获取NullPointerException或IndexOutOfBounds。我创建了一个ObservableList of Elevators,可以在其中侦听任何属性更改,然后还有另一个连接到listView的字符串类型的ObservableList。第二个是每次更改侦听器从第一个列表触发was wasUpdated()时更新。

> Property.where('property_types.name = "Residential"').count
   (1.8ms)  SELECT COUNT(*) FROM "properties" WHERE (property_types.name = "Residential")
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "property_types"
LINE 1: SELECT COUNT(*) FROM "properties"  WHERE (property_types.nam...

尝试修复它时,我有两个想法,要么ChangeListener触发更多更改,然后Platform.runLater有时间进行处理,要么与https://stackoverflow.com/a/31414801/9696324处于同一行。但是,我无法获得建议的解决方案,通常在运行该程序2-3分钟后,它不会出现任何问题。

当发生第一个错误时,GUI通常会冻结(程序仍然运行良好时),然后开始发送相同的错误消息。

任何想法或建议,将不胜感激,谢谢。

属性在电梯构造函数中声明:

    import convertapi
    filename = 'pdf_name_without.pdf'
    convertapi.api_secret = your_secret key
    convertapi.convert('jpg', {'File': filename + '.pdf'},
                              from_format='pdf').save_files(filename+'_images')

以及以下getter和setter:

final ObservableList<String> elevators = FXCollections.observableArrayList();

    final ObservableList<Elevator> obsList = FXCollections.observableArrayList(
            new Callback<Elevator, Observable[]>() {
                @Override
                public Observable[] call(Elevator param) {
                    return new Observable[]{
                            param.getCurrentFloorProp(),
                            param.getDirProp(),
                            param.getSmallSchedule(),
                            param.getDoorsProp(),
                            param.getStatusProp()
                    };
                }
            }
    );

    obsList.addListener(new ListChangeListener<Elevator>() {
        @Override
        public void onChanged(Change<? extends Elevator> c) {
            c.reset();
            while (c.next()) {
                if (c.wasUpdated()) {
                        Platform.runLater(() -> {
                            elevators.set(c.getFrom(), obsList.get(c.getFrom()).toString());
                        });
                }
            }
        }
    });

0 个答案:

没有答案