我正在使用 JavaFX TreeTableView 来显示销售订单。父行包含“主”记录,子行包含有关订单的信息,包括订购的每个产品的行项目。我正在使用 RowFactory 根据其当前状态突出显示表中的行。RowFactory 的代码以以下代码开头:
currentOrderTree.setRowFactory(new Callback<TreeTableView<MmTicket>, TreeTableRow<MmTicket>>() {
@Override
public TreeTableRow<MmTicket> call(TreeTableView<MmTicket> p) {
final TreeTableRow<MmTicket> row = new TreeTableRow<MmTicket>() {
@Override
protected void updateItem(MmTicket order, boolean empty) {
super.updateItem(order, empty);
if (order != null) {
System.out.println("Calling rowFactory method for the " + ++rowcall + " time.");
if (packingListPendingList.containsKey(order.getSono())) {
if (!getStyleClass().contains("pending")) {
getStyleClass().remove("working");
getStyleClass().remove("fulfilled");
getStyleClass().remove("completed");
getStyleClass().add("pending");
getStyleClass().remove("shipped");
}
....
如您所见,每次调用行工厂时,Callback 都会返回一个新的 TreeTableRow。根据 JavaFX 8.0 文档,系统负责管理行的创建,并在适当的时候重用它们。System.out.println 调用记录了该方法被调用的次数。多次上下滚动表格,以及更新销售数据库导致的数据刷新,导致该方法在较短的时间内被调用数万次。随着最终用户广泛使用 TreeTableView,我在程序中的内存使用量继续增长。
分析应用程序表明 HashTable 和 PsuedoClass(我相信 css 的东西)以及诸如 byte[] 和 char[] 和 int[] 之类的东西正在使用非常大量的内存。我尝试了堆大小和垃圾收集器的不同组合,但最终结果总是相同的,因为应用程序最终会耗尽堆空间。
搜索答案表明有些人遇到了这个问题,我发现如果我不做任何行突出显示,从而不调用行工厂,程序在管理内存方面要好得多。任何人都对可能导致此问题的原因或可能的解决方案有任何见解?