当前位置: 首页 > 知识库问答 >
问题:

在我更改模型时更新JavaFX表[复制]

梁丘亦
2023-03-14

我使用的是一个由渲染器对象的ObservableList支持的TableView,其设置如下:

private ObservableList<Renderer> renderers = FXCollections.observableArrayList();

@FXML
private TableView<Renderer> renderersTable;
@FXML
private TableColumn<Renderer, String> nameColumn;
@FXML
private TableColumn<Renderer, Boolean> approvedColumn;

@FXML
private void initialize() {
    nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
    approvedColumn.setCellValueFactory(new PropertyValueFactory<>("approved"));
    renderersTable.setItems(renderers);
}

渲染器对象非常简单,如下所示:

@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class Renderer extends Model {
    private String name;
    private boolean approved;
    // ...
}

我有一个从UI调用的函数,通过按下按钮并包含以下内容:

@FXML
private void approveSelectedRenderers() {
    List<Renderer> selectedRenderers = new ArrayList<>();
    selectedRenderers.addAll(renderersTable.getSelectionModel().getSelectedItems());

    for (Renderer renderer : selectedRenderers) {
        renderer.setApproved(true);
        renderers.set(renderers.indexOf(renderer), renderer);
        Thread.sleep(3000); // Simulate slowly talking to the network.
    }
}

我原本希望每3秒钟在每一行上看到一次对approved的更改,但它会执行所有行,并且只有在这之后才会更新UI。为什么会这样?如何更新UI?

共有1个答案

白文彬
2023-03-14

看起来所有渲染都是在FX线程上进行的。这将阻止您的UI,直到所有处理完成,然后将更新。

要查看长时间运行的进程——使用任务或服务,在它们的更新回调中,您可以更新UI。

您也可以使用平台。runLater()从后台运行的线程发回UI线程。

 类似资料:
  • 问题内容: 我试图弄清楚Angular的工作原理,并在模型更改时无法更新视图。 的HTML JS http://jsfiddle.net/N2G7z/ 有任何想法吗? 问题答案: 正如上面提到的Ajay beniwal一样,您需要使用Apply来开始消化。

  • 我尝试重新验证()和重新绘制(),但没有改变。 现在有趣的事情来了。如果我用for(int I=0;I 只有当我用另一个我手动填写的列表创建和设置新模型时,我才能查看更新。

  • 问题内容: 我用来加载图像。值是从一些范围变量加载的,如下所示: 我的问题是,当我运行时,它会使属性为空,但不会在属性中反映出来。因此,我不断看到需要空占位符的图像。 我该如何处理? 问题答案: 这是ngSrc和ngHref指令的预期行为。这些指令仅支持识别新路径,但是当路径不可用时,这些指令将以静默方式退出(我在这里看到一个拉取请求。)。 因此,当图像变量不再可用时,可能的解决方法是将ngSho

  • 我现在迷路了。

  • 问题内容: 我正在尝试使用包含Latex样式方程式的AngularJS双向绑定文本。我想调用MathJax格式化方程式,但是我不确定在AngularJS完成更改模型后确保调用MathJax的最佳方法。我想我需要回调。这是我的JavaScript: } 这是我的HTML: 小提琴在这里:http : //jsfiddle.net/LukasHalim/UVjTD/1/。您会注意到,即使您单击两次更新

  • 我的视图中有一个树查看器,它从标准的Ecore编辑器中监听EMF模型,并用它做进一步的事情。我已经注册了一个选择监听器,它检查所选元素是否是树查看器需要作为输入的类型。因此,问题是,如果模型中有任何变化(例如,向现有元素添加新元素或新信息等),树查看器仅在用户更改选择时才显示更改后的模型,即单击任何模型元素等。 但是我需要做的是,如果底层模型发生变化,树查看器将直接得到通知,并显示新的模型元素,而