【发布时间】:2019-05-24 12:48:55
【问题描述】:
我遇到了ObservableList 的问题。我正在做的是,向ObservableList 添加一个元素,然后将其设置为TableView,但问题是每当我使用addAll() 向ObservableList 添加一个元素时,TableView 中会显示一些额外的元素。
这是我的代码 sn-p
public void startRun(final TestCase test) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
if (sessionConfig.isEnableSessionControl() || detailscol.isVisible() == false)
saveReportBtn.setDisable(true);
else
saveReportBtn.setDisable(true);
testCaseList.add(test);
start = "Running";
removerow++;
startRunDataList = FXCollections.observableArrayList(new TestExecutionTable(test.getName(), start));
updatedDataStartrun.addAll(startRunDataList);
testExecutioTable.setItems(updatedDataStartrun);
lastOne = startRunDataList.get(0);
}
});
t.start();
}
在哪里testCaseList = new ArrayList<TestCase>();
startRunDataList = FXCollections.observableArrayList();
updatedDataStartrun= FXCollections.observableArrayList();
在类开始时初始化。
上面的方法startRun(final TestCase test) 正在循环中被调用。
for (TestCase test : tests) {
CountDownLatch latch = new CountDownLatch(1);
listener.startSuite(null);
listener.startRun(test);
try {
test.run(context, listener);
listener.passed(test, latch);
} catch (TestFailure failure) {
listener.failed(test, failure, latch);
//latch.wait();
} catch (Throwable t) {
listener.error(test, t, latch);
//latch.wait();
} finally {
listener.endRun(test);
}
}
但是,上面的代码在 Java 7 上运行良好,但在更高版本(Java 8 及更高版本)上却不行。
【问题讨论】:
-
您正在从后台线程修改 GUI。这样做的结果是不可靠的,在某些情况下甚至可能破坏 GUI。**请勿从后台线程修改 gui。**可能在线程之间共享字段值会使事情变得更糟。多次添加相同的值,因为在分配
startRunDataList和使用addAll之间,列表可以替换为另一个线程完成的分配。此外,创建ObservableList包含单个元素只是为了将其添加到另一个列表是绝对没有必要的。只需使用该列表的add方法即可。 -
感谢您的建议。我试试同样的
标签: java javafx observablelist