为什么在非JavaFX线程上可以将文本附加到TextArea并滚动?

时间:2017-05-22 12:06:18

标签: java multithreading javafx

据我所知,javafx场景的所有更改都必须在javafx线程上进行。但是,我运行以下代码,我没有任何例外。

  TextArea mainTextArea = ...
  new Thread(()->{
        for (int i = 0; i < 10; i++){
          mainTextArea.appendText(String.valueOf(i));
          mainTextArea.positionCaret(mainTextArea.getText().length());
        }
    }).start();

似乎我想念一些东西。请解释一下。

1 个答案:

答案 0 :(得分:3)

仅仅因为你没有得到任何例外,并不意味着它是安全的。无法保证这会起作用,并且在任何时候都容易出现故障(即随意查看损坏的数据)。

JavaFX API尽最大努力在违反线程规则时抛出异常,但在某些情况下不会这样做(基本上,在某些操作中检查执行该方法的线程的成本太高了) )。从历史上看,在JavaFX 2.2之前,根本没有抛出任何异常(类似于Swing);但是,必须仅在FX应用程序线程上访问作为场景图一部分的UI组件的要求仍然存在。