我有string region = Region.AsiaEast.ToString();
,其中包含View
。
第一次加载视图时,创建ListCells需要一些时间。为防止用户界面被阻止,我将调用包裹在ListView
中的listView.setItems
,并将placeHolder设置为listView作为加载过程的指示器。
视图Platform.runLater
包含AppBar
和一些TextField
,它们通过css-file设置样式。虽然按钮的样式正确,但textField首先出现时没有应用任何样式,即黑色,一旦填充了ListView,TextField也会应用其样式。
这种延迟可能是什么原因?
Buttons
编辑:
只有-fx-text-fill在延迟后应用。所有其他样式立即应用。
@Override
protected void onShowing() {
appBar.setNavIcon(getBackButton());
appBar.setTitle(searchField.getTextField());
appBar.getActionItems().addAll(btnSort, btnFilter, moreMenu);
}
@Override
protected void onShown() {
setItems();
}
protected void setItems() {
if (!firstShow) {
lview.setItems(items);
} else {
if (!items.isEmpty()) {
lview.setPlaceholder(new Label("loading data..."));
Platform.runLater(() -> lview.setItems(items));
}
firstShow = false;
}
}
重现问题的代码:
.app-bar > .title-box > .text-field{
-fx-border-width: 0.0;
-fx-border-insets: 0.0;
-fx-padding: 0.0;
-fx-font-family: 'Roboto Medium';
-fx-font-size: 20.0;
-fx-text-fill: -app-bar-item-color;
-fx-prompt-text-fill: #59819C;
}
.app-bar > .action-items .button{
-fx-text-fill: red;
}
答案 0 :(得分:0)
发布代码后,我可以在Android上重现该问题。
显然,我接受了这一部分:
private void onShown() {
lview.setPlaceholder(new Label("loading data..."));
Platform.runLater(() -> {
try {
Thread.sleep(2000); //to simulate a long lasting initial creation of listCells
} catch (InterruptedException e) { }
lview.setItems(items);
});
}
添加以模拟单元格的初始创建。
但正是它显示了您面临的问题:模拟示例显示在JavaFX线程(Platform.runLater
)上,您阻止了它(Thread.sleep(2000)
)。在此期间,textField文本为黑色,稍后才会对其进行样式设置。
如果您将该片段修改为此片段:
private void onShown() {
lview.setPlaceholder(new Label("loading data..."));
new Thread(new Task<Void>() {
@Override
protected Void call() throws Exception {
try {
Thread.sleep(2000); //to simulate a long lasting initial creation of listCells
} catch (InterruptedException e) { }
return null;
}
@Override
protected void succeeded() {
lview.setItems(items);
}
}).start();
}
现在繁重的任务在JavaFX线程之外,你可以看到textField是立即设置的。
回到你真正的问题:这里的教训可能是你应该在每次繁重的任务中移出JavaFX线程,并且只在最后一刻调用它。 Task
是一个很好的机制。