JavaFX:Platform.runLater(任务)无法识别task = new FutureTask<>(new Runnable(){....}?

时间:2015-12-08 05:37:46

标签: multithreading javafx-8 sleep runnable futuretask

在过去的两周里,我研究了10种避免sleep()问题的方法。在UI线程上运行无法中断的代码块的概念似乎是最实用的。所以我开始创建一个FutureTask<Void>对象,其中包含在完成之前不会被中断的代码。 for循环中的代码pixelArray[r][c].setFill(color)Circle中的Grid Array对象设置了32x64的新颜色。如果在像素艺术文件之间调用sleep(5000)FileChooser选择并分配给List<File> selectedFiles,则始终无法显示颜色。遗憾的是,以下代码无法编译,因为runLater中的linePlatform.runLater(diplayFileTask);无法在以下代码中解析:

public class PlayPlaylist{

public static List<File> selectedFiles;

public static void play() throws ExecutionException {

    FileChooser fileChooser = new FileChooser();
    fileChooser.setInitialDirectory(new File("C:\\ProgramData\\L1 Art Files\\"));
    fileChooser.setTitle("Play One or More Pixel Art Files");
    List<File> selectedFiles = fileChooser.showOpenMultipleDialog(null);
    for (File selectedFile : selectedFiles) {
        try {
            displayFile(selectedFile.getPath());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public static void displayFile( String pathName) throws IOException, InterruptedException, ExecutionException {

    FutureTask<Void> displayFileTask = new FutureTask<>(new Runnable() {
        @Override
        public void run() {

            path = Paths.get(pathName);
            try {
                pixelByteArray = Files.readAllBytes(path);
            } catch (IOException e) {
                e.printStackTrace();
            }


            int cnt = 0;
            for (int r = 0; r < row; r++) {
                for (int c = 0; c < col; c++) {
                    //int i = r * col + c;
                    //System.out.println("\nr = " + r + "  c = " + c);

                    String hexRGB = String.format("#%02X%02X%02X",
                            pixelByteArray[cnt++],                  //red
                            pixelByteArray[cnt++],                  //green
                            pixelByteArray[cnt++]);                 //blue

                    Color color = Color.valueOf(hexRGB);
                    //System.out.println("\ncolor is " + color);

                    pixelArray[r][c].setFill(color);
                }
            }
            String fileName = path.getFileName().toString();
            window.setTitle(MessageFormat.format("Pixel Array {0} x {1}    File:  {2}", Integer.toString(row), Integer.toString(col), fileName));
        }
    }, null); // displayFile
    Platform.runLater(displayFileTask);
    displayFileTask.get();
    sleep(5000);
}

我在Stack Overflow中密切关注了示例,但未能看到问题。

我详细了解Stack Overflow上发布的过去尝试:Wait() & Sleep() Not Working As Thought

我还在网络上发布了两个用户界面窗口:Virtual Art。我认为像素阵列窗口中显示的像素艺术阐明了创建用户定义的幻灯片放映的目标。

任何人都可以纠正我的错误吗?您认为我的sleep(5000)位于最佳位置吗?

回答James_D的问题。这是我在第一篇文章Wait() & Sleep() Not Working As Thought上给出答案的最佳解决方案。我实际上是在java thread immediately update UI发布了您的逻辑和代码。

我保存并显示32x64的像素艺术文件。您可以在Virtual Art网站上看到发布的示例。我认为在Playlist下创建幻灯片放映会很简单,点击Play。我会在for循环中使用相同的类和OpenFile(pathname)方法来显示选中并放在ArrayList<>中的每个文件,但通过将Thread.sleep(5000)置于循环中来暂停。

正如您所指出的那样,这不起作用,正如我最清楚的那样,因为Thread.sleep(5000)会中断UI线程,导致“跳过”仅仅循环通过的所有文件的显示代码。但是最后一个像素艺术文件将在5秒后出现

我认为您在上面引用的帖子中的答案适用:您使用FutureTask<Void>Platform.runLater<task>创建一个代码块,在完成之前无法中断。我认为FutureTask<Void>在UI线程上运行,并且会在Thread.sleep(5000)中断之前完成显示像素艺术文件。

68岁退休后,我是JavaFX的新手,并尝试开发可以使用基本像素编辑器编程的RGB LED产品。学习JavaFX对我来说是一个真正的挑战,感谢你的时间和耐心

0 个答案:

没有答案