【发布时间】:2016-06-02 07:33:52
【问题描述】:
所以我在 FXML 中定义了一个 ListView
<ListView fx:id="editRecipeList" layoutX="14.0" layoutY="14.0"
onMouseClicked="#recipeEditListViewOnMouseClicked" prefHeight="406.0"
prefWidth="242.0" />
以及对应的方法
@FXML
protected void recipeEditListViewOnMouseClicked() {
System.out.println("method started");
List<Document> recipesForEditingClick = mongoDatabase.getCollection("recipes")
.find(eq("name", "somethng");
//etc
}
方法不是很大,但是第一行代码System.out.println()只有在5 SECONDS之后才执行!但是在同一个程序的其他ListView中,ListView没有速度问题吗?怎么会这样?如果需要任何其他信息,请发表评论
【问题讨论】:
-
你可以创建一个synchronized block 如果足够的话,或者你可以disable listview 并在方法结束时重新启用。
-
如果方法调用需要任何可观的时间来执行,无论如何你都应该将它移到后台线程,否则在方法执行时 UI 只是没有响应。如果您使用
Service,那么您只需检查它是否正在运行,如果是则忽略鼠标单击。或者您可以在开始之前禁用列表视图,然后再次启用它 - 但请注意,如果您不将阻塞调用移动到后台线程,这将无效。 -
对不起,伙计们,我是新来的,我不知道是否可以,但我稍微改变了问题的主题。我已经想出了
editRecipeList.setDisable(true);,在方法完成后我将值更改为false。无论如何,我认为这是一个数据库性能问题,但它是 JavaFX 问题 -
我有点怀疑。如果您注释掉数据库访问(可能只是创建一些硬编码数据),您还会看到延迟吗?您可能会看到 JVM 重新排序代码执行(如果它不影响最终结果,它可以这样做)或您的环境的工件。如果将数据库调用放入
Task会发生什么? -
是的,数据库评论它工作正常。但使用另一种方法,数据库很快。我不知道怎么了-_-