【问题标题】:Updating imageView from Task thread [duplicate]从任务线程更新 imageView [重复]
【发布时间】:2016-05-08 11:49:30
【问题描述】:

我编写了一个光线追踪器渲染应用程序,现在我正在尝试将它连接到 GUI。我想实现从白色画布到结果的逐像素过程渲染的效果。具体来说,当我的跟踪应用程序计算某个像素的颜色时,我希望它立即写入图像。而不是那个 GUI 在渲染时被冻结并且只显示最终结果。然后我决定通过在后台线程中运行的渲染进程来修复它。在阅读了一些文档后,我发现为了动态更新 GUI,应该使用 Tasks 和 Platform.runLater 方法。这是与我的问题相关的代码: 在 RenderWindowController 中,我将 ImageView 连接到 XML 表单

@FXML
private volatile ImageView imageView;

创建场景后,此代码运行渲染过程

Task<Void> task = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            world.getCamera().renderScene(world);
            return null;
        }
    };

方法 renderScene 循环遍历图像的行和列并计算每个像素的颜色

...
WritableImage img = ...
PixelWriter pixelWriter = img.getPixelWriter();
for rows {
    for columns {
...
pixelColor = tracer.traceRay();
pixelWriter.setColor(column, row, pixelColor);
Platform.runLater(() ->  *reference to my ImageView*.setImage(image));
    } 
}

这段代码的作用与我没有使用线程一样。 我是线程和 JavaFX 的新手。谁能指出我做错了什么?

【问题讨论】:

    标签: java multithreading javafx-8


    【解决方案1】:

    也许这个链接对阅读很有用。它与 Swing 中的并发有关。 该链接包含一些代码示例。

    https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

    例如

       import javafx.concurrent.Task;
    
        Task<Integer> task = new Task<Integer>() {
         @Override protected Integer call() throws Exception {
         int iterations;
         for (iterations = 0; iterations < 100000; iterations++) {
            if (isCancelled()) {
               break;
            }
            System.out.println("Iteration " + iterations);
         }
         return iterations;
        }
       };
    

    【讨论】:

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