【问题标题】:ObservableList with extra elements in tableview表视图中带有额外元素的 ObservableList
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多