Java 重启按钮抛出异常,我不知道如何修复它

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(

这是我的第一个问题,我对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( 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);