【发布时间】:2016-08-11 15:43:58
【问题描述】:
我有一张图片,我想反转它。我写了算法,效果很好。 但是我想一点一点地显示反转(显示第一列的像素,然后显示第二列的像素,等等),因为它更好!
所以我使用Service 和Task 类将包含此算法的类(GraphicEngine) 设为线程。后者将由另一个类 (Gui) 启动,即 GUI。在 JavaFX 中这样进行是很常见的。
问题是反转的显示卡在图像的开头或中间……这是随机的。我不知道为什么。
这里是源代码:
Launcher 类:
import javafx.application.Application;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Launcher extends Application {
public static void main(String args[]) {
launch(args);
}
public void start(Stage stage) {
stage.setWidth(700);
stage.setHeight(700);
stage.setMaximized(true);
Gui gui = new Gui(stage, new BorderPane(), 700, 500);
gui.fill();
stage.setScene(gui);
stage.show();
}
}
在 Gui.java 中(扩展场景):
this.button_reverse_image.setOnAction(button -> {
this.graphic_engine.restart();
});
在 GraphicEngine.java 中:
public class GraphicEngine extends Service<Void> {
private WritableImage writable_image;
private PixelReader writable_pixel_reader;
private PixelWriter writable_pixel_writer;
public Task<Void> createTask() {
return new Task<Void>() {
protected Void call() {
double r, g, b;
for(int x = 0; x < writable_image.getWidth(); x++) {
for(int y = 0; y < writable_image.getHeight(); y++) {
r = writable_pixel_reader.getColor(x, y).getRed()*255;
g = writable_pixel_reader.getColor(x, y).getGreen()*255;
b = writable_pixel_reader.getColor(x, y).getBlue()*255;
writable_pixel_writer.setColor(x, y, Color.rgb((int) (255 - r), (int) (255 - g), (int) (255 - b)));
}
}
return null;
}
};
}
【问题讨论】:
-
您是否在单独的线程上运行任务?请提供执行任务的代码(大概是
GraphicEngine#restart?) -
restart在类Gui中被调用,它扩展了Scene。 -
我添加了第三个(也是最后一个)类的源代码:Launcher
-
@sillyfly
Service通过默认执行程序管理线程。 -
@James_D - 啊,对,我错过了
GenericEngine扩展Service的事实。