Java 重启按钮抛出异常,我不知道如何修复它
这是我的第一个问题,我对JavaFX还不熟悉。我编写了一个小游戏,我不知道如何让重启按钮工作。以下是缩短的代码:Java 重启按钮抛出异常,我不知道如何修复它,java,javafx,Java,Javafx,这是我的第一个问题,我对JavaFX还不熟悉。我编写了一个小游戏,我不知道如何让重启按钮工作。以下是缩短的代码: public class Main extends Application { private Pane root = new Pane(); private static Button btnNewGame = new Button( "Neues Spiel?" ); private static Sprite player = new Sprite(
public class Main extends Application {
private Pane root = new Pane();
private static Button btnNewGame = new Button( "Neues Spiel?" );
private static Sprite player = new Sprite( getRandomNumberInts( 590, 1230 ), getRandomNumberInts( 50, 670 ), 40, 40, /*"player",*/ Color.BLUE );
...
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle( long now ) {
update();
}
};
private Parent createContent() {
root.setPrefSize( 1280, 720 );
timer.start();
nextLevel();
return root;
}
private void nextLevel() {
root.getChildren().add( player );
...
}
private void update() {
snake.moveToTarget();
if ( snake.getBoundsInParent().intersects( player.getBoundsInParent() ) ) {
player.dead = true;
player.win = false;
}
if( player.dead ) {
root.getChildren().add( btnNewGame );
root.getChildren().clear();
timer.stop();
}
if( player.win ) {
root.getChildren().add( btnNewGame );
root.getChildren().clear();
timer.stop();
}
root.getChildren().removeIf( n -> {
Sprite s = ( Sprite ) n;
return s.dead;
});
}
void cleanup() {
timer.stop();
root.getChildren().clear();
}
@SuppressWarnings("incomplete-switch")
public void startGame( Stage stage ) {
Scene scene = new Scene( createContent() );
scene.setOnKeyPressed( e -> {
switch ( e.getCode() ) {
case W:
});
btnNewGame.setOnAction( e -> {
restart( stage );
});
stage.setScene( scene );
stage.setTitle( "ZZZZZnake - Von Christoph Gabauer" );
stage.getIcons().add( new Image( Main.class.getResourceAsStream( "icon.png" ) ) );
stage.setResizable( false );
stage.show();
}
void restart( Stage stage ) {
cleanup();
start( stage );
}
@Override
public void start( Stage primaryStage ) {
startGame( primaryStage );
}
private static class Sprite extends Rectangle {
//final String type;
double pSpeed = 5;
Sprite( int x, int y, int w, int h, /*String type,*/ Color color ){
super( w, h, color );
//this.type = type;
setTranslateX( x );
setTranslateY( y );
这里有一些德国的东西,但不要让它们分散你对问题的注意力。我认为异常与启动或升级方法有关。
这是一个例外:
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.control.Button cannot be cast to application.Main$Sprite
at application.Main.lambda$0(Main.java:193)
at java.util.Collection.removeIf(Unknown Source)
at application.Main.update(Main.java:191)
at application.Main.access$0(Main.java:91)
at application.Main$1.handle(Main.java:53)
at javafx.animation.AnimationTimer$AnimationTimerReceiver.lambda$handle$0(AnimationTimer.java:57)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.animation.AnimationTimer$AnimationTimerReceiver.handle(AnimationTimer.java:56)
at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:357)
at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:267)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:557)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:541)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:534)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:340)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$4(WinApplication.java:186)
at java.lang.Thread.run(Unknown Source)
这样做的目的是,当你点击按钮时,游戏会重新启动,动作与之前相同。
我希望你能帮助我解决我的问题,并提前谢谢你
来自巴伐利亚州的问候克里斯托夫问题在于您的更新方法:
您只需假设getChildren返回的所有元素都是精灵,但异常状态表示其中至少有一个javafx.scene.control.Button
如果只想移除死掉的精灵,请使用以下方法:
root.getChildren().removeIf(n -> n instanceof Sprite && ((Sprite)n).dead);
作为对未来的提示:学习阅读stacktraces。大多数时候,他们会告诉你问题出在哪里。欢迎来到SO。您能准确地指出引发异常的行吗?请这并不是一大堆几乎不相关的代码——相反,提取出最小值来演示问题:->堆栈溢出问题在lambda root.getChildren.removeIf n->{Sprite s=Sprite n;return s.dead;};,您只需将每个子元素都施放给精灵,但显然有一些元素无法施放,因为它们不是精灵。这会导致异常。如果您的第一个问题已解决,请接受答案。StackOverflow不是为动态问题设计的。如果您有新问题,请提出新问题。谢谢,但现在它显示:线程JavaFX应用程序线程中的异常java.lang.IllegalArgumentException:Pane@6269df8[styleClass=root]已设置为另一个场景的根,如何修复?我必须为它制作一个新的窗格吗?
root.getChildren().removeIf(n -> n instanceof Sprite && ((Sprite)n).dead);