我正在创建一个游戏,在这个游戏中,我创建自定义的赛车轨道,并将它们存储在数据库中作为字符串。我在画布上画画,使用快照创建WritableImage,然后使用PixelReader逐个读取像素,为每种颜色存储不同的字符(在游戏中,这是一个不同的对象)。起点、终点线、墙等)。
在我创建的第一条赛道上,一切都很好,但在其他时候,我按下按钮来保存赛车跑道(即使我退出了之前的舞台,我进入了一个新的阶段),我得到了这个例外:
java.lang.IllegalStateException: Resource obsoleted too many times at com.sun.prism.impl.ManagedResource.contentsNotUseful(ManagedResource.java:461) at com.sun.prism.impl.BaseTexture.contentsNotUseful(BaseTexture.java:278) at com.sun.javafx.sg.prism.NGCanvas.renderStream(NGCanvas.java:819) at com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:578) at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043) at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951) at com.sun.javafx.tk.quantum.QuantumToolkit$18.draw(QuantumToolkit.java:1318) at com.sun.javafx.tk.quantum.QuantumToolkit$18.run(QuantumToolkit.java:1354) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:129) at java.lang.Thread.run(Thread.java:745)
我认为这与快照未被完整呈现有关,但我不知道如何解决这个问题。
我尝试启动一个新线程,并使用"Thread.sleep(1000)“来给它一些时间来完成呈现,就像我在https://community.oracle.com/thread/2579185中看到的那样,但是它没有改变任何事情。
编辑:这是一个SSCCE
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class ExceptionClass extends Application {
Canvas c;
GraphicsContext gc;
WritableImage temp;
int x = 0, y = 0;
@Override
public void start(Stage primaryStage) {
c = new Canvas(400, 400);
gc = c.getGraphicsContext2D();
gc.setStroke(Color.BLACK);
gc.setLineWidth(5.0);
temp = c.snapshot(null, temp);
Button btn = new Button("Damn you, stupid exception!");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Altering the canvas...");
gc.strokeOval(x, y, 20, 20);
PixelWriter pr = gc.getPixelWriter();
pr.setColor(x + 10, y + 10, Color.RED);
temp = c.snapshot(null, temp);
x += 20;
y += 20;
}
});
StackPane root = new StackPane();
root.getChildren().addAll(c, btn);
Scene scene = new Scene(root, 800, 800);
primaryStage.setTitle("Exception!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}我的假设是错误的。事实证明,我创建的PixelWriter导致了这个异常。我之前没有提到它,因为我认为它是不相关的,它的工作是改变一个像素的颜色来表示我的游戏的起点,这就是为什么只有当我保存一个曲目时,它才会被调用。我仍然想知道为什么会抛出这个异常:)
发布于 2014-04-30 12:13:11
这被报告为RT-33294。根据错误报告,这是8.0.0中的回归,因此它应该可以很好地处理之前的版本,以及8.0.0_20和更高版本。
对于8.0.0和8.0.0_05,建议的解决方法是调用setPixels而不是setColor
PixelWriter pr = gc.getPixelWriter();
// pr.setColor(x + 10, y + 10, Color.RED);
pr.setPixels(x + 10, y + 10, 1, 1, PixelFormat.getIntArgbInstance(), new int[] { 0xffff0000 }, 0, 1);
temp = c.snapshot(null, temp);https://stackoverflow.com/questions/23378519
复制相似问题