我正在尝试开发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());
});
}
}
}
});