首页 > 解决方案 > 表视图中带有额外元素的 ObservableList

问题描述

我面临一个问题ObservableList。我正在做的是,添加一个元素ObservableList然后将其设置为TableView但问题是每当我添加一个元素以ObservableList使用addAll()一些额外的元素时显示在TableView.

这是我的代码片段

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 及更高版本)上却不行。

标签: javajavafxobservablelist

解决方案


您正在运行可并行化的代码(在不同线程中工作的代码),没有任何同步。因此,各种线程可以以完全任意的方式相互交织。Java 7 可能使用了不同的调度机制,导致您的代码意外地正常工作。

如果您曾经遇到不同线程可能并行访问集合的情况,您可能希望将代码片段包装在synchronized块中,以确保给定的代码片段以原子方式执行,而不受其他线程的任何干扰。


推荐阅读