我有这个常见问题,因为它似乎是 . 重置后,我的表视图不会刷新我的项目 . 我检查了数据,这是新的数据 .
I tried multiple solution from internet but no success.
无法重置所有列,因为它添加了一个空的额外(不知道原因)和调整大小只是破坏 .
我的 table 不是 editable . 新数据已更改 .
如果项目和行更改(:|),则刷新数据 .
我只是没有想法 .
目前刷新代码非常简单 .
ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);
新数据再次正确 . 当我选择tableView时,它返回新的正确Item .
24 回答
基于DanielDeLeón的回答
在Jira中查看此问题:https://bugs.openjdk.java.net/browse/JDK-8098085
评论2012-09-20 08:50给出了一个有效的解决方法 .
我有类似的问题与刷新 . 我的解决方案是将
ObservableList
上的操作限制为与bind()
一起正常工作的操作 .假设
ObservableList obsList
是TableView
的基础列表 .然后
obsList.clear()
(继承自java.util.List<>
) not updateTableView
正确但是 .同时调用
setItem(obsList)
确实 not work 触发刷新......但......obsList.removeAll(obsList)
(由ObservableList
覆盖) works fine 因为它正确触发了changeEvent .使用全新内容重新填充列表,然后按如下方式工作:
obsList.removeAll(obsList);
obsList.add(...); //e.g. in a loop...
要么
obsList.removeAll(obsList);
FXCollections.copy(obsList, someSourceList)
最好的问候Ingo
解决方法:
从
JavaFX 8u60
开始,您可以使用(假设tableView
是TableView类的实例):从文档:
UPDATE:
最后,在 JavaFX 8u60 中解析了tableview刷新,可以进行早期访问 .
关于刷新请参阅Updating rows in Tableview .
关于空白栏,请参阅JavaFx 2 create TableView with single column . 基本上它不是列,即您无法选择单击此空白列项目的项目 . 它只是一个空白的区域,风格像一排 .
UPDATE: 如果要通过
reseller_table.setItems(data)
更新tableView,则不需要使用SimpleStringProperty
. 如果您只更新一行/项,这将非常有用 . 以下是刷新表数据的完整示例:注意
和
几乎相同 . 因此,当表刷新时,我第一次用表填充表格 . 它仅用于演示目的 . 我已经在JavaFX 2.1中测试了代码 . 最后,您可以(并且应该)编辑您的问题,通过移动问题答案中的代码片段来改进它 .
我终于找到了一个丑陋的解决方法来刷新所有行 .
oldItems.equals(newItems)似乎有几个独立的问题
RT-22463:tableView的第一部分即使调用items.clear()也不会更新
这是固定的 . 在设置新列表之前清除旧项清除所有旧状态,从而刷新表 . 任何不起作用的例子都可能是回归 .
什么仍然无效是重新设置项目而不先清除
那个's a problem if the table is showing properties that are not involved into an item'的平等决定(参见RT-22463或Aubin's中的例子)并且有希望 - 由RT-39094覆盖
UPDATE :RT-39094后者也是固定的,为8u40!应该在几周内冒泡进入ea,推测u12等 .
技术原因似乎是单元格实现中的相等检查:在实际调用updateItem(T,boolean)之前检查项目的更改是为了修复性能问题 . 合理的,只是硬编码“改变”== old.equals(new)在某些情况下会出现问题 .
一个对我来说没问题的解决办法(没有正式测试!)是一个自定义TableRow,如果需要进行身份检查,它会跳入:
请注意,TableCell具有类似的硬编码等式检查,因此如果自定义行不够,则可能需要使用具有类似解决方法的自定义TableCell(尽管没有遇到需要的示例)
我想this thread对表刷新问题有很好的描述 .
什么是BUG!这是另一种解决方法......
我做了SSCCE到show the bug . 我鼓励大家用另一种更优雅的方式解决它,因为我的解决方法非常难看!
我有一个用例,其中没有其他任何帮助作为Aubin的解决方案 . 我调整了方法,并通过删除项目列表中的项目列表并将其添加到表项目列表中来更改它,因为它最终只能通过此hack可靠,列可见切换仅在第一次完成作业 .
我在Jira任务中报告了它:https://javafx-jira.kenai.com/browse/RT-22463
我有同样的问题,经过一些搜索,这是我的解决方法 . 我发现如果删除列然后重新添加,则更新表 .
用法示例:
user1236048的解决方案是正确的,但关键点不是可观察列表,您不仅需要设置getter和setter方法,还需要设置一个名为Property的新方法 . 在Oracle的tableview教程(http://docs.oracle.com/javafx/2/ui_controls/table-view.htm)中,他们离开了关键部分!
这是Person类应该是什么样子:
}
不要手动刷新,而应使用可观察的属性 . 这个问题的答案的例子目的是:SimpleStringProperty and SimpleIntegerProperty TableView JavaFX
我一直试图找到一种刷新tableView(ScalaFx)3-4小时的方法 . 最后我得到了答案 . 我只想发布我的解决方案,因为我已经浪费了几个小时 .
我的JDBC CLASS
model是我的jdbc连接类的引用
这是scalafx代码,但它给javafx一些想法
JavaFX8
我正在通过DialogBox添加新项目 . 这是我的代码 .
At initialize() or setApp()
getAreaData()
按对话框添加 .
Area
是一个普通的JavaFX POJO . 希望这有助于某人 .initialize()方法
用户类(Hibernate POJO类)
refresh()方法
我的解决方案类似于Daniel De León的解决方法,但是当您需要隐藏第一列(在他的示例中为索引0)时它也有效 . 当然你可以在他的解决方案中更改索引,但如果要重新排列列,我的解决方案可能会更适合您 . 我们的想法是隐藏和显示列的名称,而不是隐藏和显示它的索引:
最好在UI更新线程中更新您的表 . 但是,它也可以通过在您更改表中的内容后调用
updateMyTableView();
来工作,因为JavaFX似乎无论如何都要在UI线程中更新(不确定) .我不确定这是否适用于您的情况,但我会发布对我有用的内容 .
我根据查询/搜索更改我的表视图到数据库 . 例如,数据库表包含患者数据 . 我程序中的初始表视图包含所有患者 . 然后我可以通过firstName和lastName搜索患者的查询 . 我使用此查询的结果来重新填充我的Observable列表 . 然后我通过调用tableview.setItems(observableList)重置tableview中的项:
if块使用查询结果更新ObservableList .
同样的问题,我尝试了一些解决方案,对我来说最好的是:
在控制器的initialize-method中,创建一个空的observableList并将其设置为表:
在您的update-method中,只需使用observableList,清除它并添加刷新的数据:
没有必要再次设置表的项目
按照DanielDeLeón的回答......
我在我的模型中引入了一个虚拟属性"modelChangedProperty"
在我的模型中创建了一个方法refresh(),用于更改该属性的值 .
在我的控制器中,我向dummy属性添加了一个监听器,用于更新表视图 .
我知道这个问题已经有4年了,但是我遇到了同样的问题,我尝试了上面的解决方案并没有奏效 . 我也称为refresh()方法,但仍然不是我期望的结果 . 所以我在这里发布我的解决方案可能会帮助某人 .
即使在此之前,我在ObeservableList中使用了另一个变量来将项目设置到tableview中,我称之为“污秽方法”,但直到我得到更好的解决方案才行 .
好吧之后寻找所有可能的解决方案 . 首先尝试清除数据然后添加到tableview
tableView.getItems().clear();
仍然无法解决我的问题 . 我尝试了这里给出的所有答案,但没有为我工作,我的表中仍然有陈旧的对象,如下图所示:为了解决这个问题,我创建了一个DUMMY标签并使用
setGraphic
如下:我始终认为利用更改的TableColumn的visable属性的方法违反数据绑定的精神,若这是JavaFX的错误的那也早就该接决了,不应该拖到Java8了还不解决 .
经过跟踪JavaFX的源代码后,并没有发现bug . 利用Listener等方法观察也没有异样 . 也尝试利用JFace中的PropertyChangeSupport方式宣告POJO内容变更也没有效果 . 最后将DoubleProperty改为WritableObjectValue,问提就解决了 .
我已经坚定使用更改列可见属性不符合数据绑定自动化的目的 .
之后我跟踪了JavaFX TableView源代码 . 我从未发现Tableview绑定问题的任何问题代码 . 4周前,我将POJO字段的类型从DoubleProperty更改为WritableObjectValue,问题解决了 .
示例代码: