在过去的两周里,我研究了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对我来说是一个真正的挑战,感谢你的时间和耐心。