2016-04-06 24 views
2

Başka bir sınıftaki bir sahneyi değiştirmek istiyorum ancak büyük zorluk yaşıyorum.JavaFX'te Sahneleri Değiştirme NullPointerException

Şimdi ikinci ekrana geçmeden sorun yok, ancak ilk ekrana geri dönme bana NullPointerException veriyor.

Yardım çok takdir edilecektir. Şimdiden çok teşekkürler.

Ana Sınıfı

public class Main extends Application { 

Stage ps; 
Group root = new Group(); 
Scene s = new Scene(root, 300, 300, Color.AQUA); 
Controller con = new Controller(); 


public void start(Stage primaryStage) throws Exception { 
    ps = primaryStage; 
    con.buttonLayout(); 
    buttonLayout(); 

    primaryStage.setTitle("Hello World"); 
    ps.setScene(s); 
    primaryStage.show(); 
} 

public void buttonLayout() { 
    Button but = new Button("first"); 

    but.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      ps.setScene(con.s); 
     } 
    }); 

    root.getChildren().add(but); 
} 


public static void main(String[] args) { 
    launch(args); 
} 
} 

Diğer sınıf

public class Controller{ 
Group root = new Group(); 
Scene s = new Scene(root, 300, 300, Color.BLACK); 


public void buttonLayout() { 
    Button but = new Button("back to first"); 

    but.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      Main main = new Main(); 
      main.ps.setScene(main.s); 
     } 
    }); 

    root.getChildren().add(but); 
} 
} 
+0

'sen Üzerinde' setScene' çağırdığınızda size bir boş gösterici istisna olsun böylece main.ps', hiçbir zaman başlatıldı. –

cevap

4

yeniden yapılandırılması için başvuru, sadece bir yerine iki denetleyicileri oluşturun. Yani her sahne için bir denetleyiciniz var. Ve ana uygulamanızda, ilk sahneyi ayarlamak için sadece ilk denetleyiciyi çağır.


tamamen FXML kullanmaz, önbelleğe sahneler veya denetleyicileri yapar ve ek bir basitleştirilmiş örnek içeriğini değiştirir: Burada

bir örnek Her bir navigasyonda sahnenin görünümü:

firstsecond

Main.java

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class Main extends Application { 
    public void start(Stage stage) throws Exception { 
     Controller1 controller1 = new Controller1(); 
     Scene scene = new Scene(
       controller1.getContent(), 300, 300, Color.AQUA 
     ); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Controller.java

import javafx.scene.Parent; 

public interface Controller { 
    Parent getContent(); 
} 

Controller1.java

import javafx.scene.Parent; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 

public class Controller1 implements Controller { 
    private final StackPane root; 

    public Controller1() { 
     Button navToSecond = new Button("second"); 

     navToSecond.setOnMouseClicked(event -> { 
      Controller2 controller2 = new Controller2(); 
      navToSecond.getScene().setRoot(controller2.getContent()); 
     }); 

     root = new StackPane(navToSecond); 
    } 

    @Override 
    public Parent getContent() { 
     return root; 
    } 
} 

Controller2.java

import javafx.scene.Parent; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 

public class Controller2 implements Controller { 
    private final StackPane root; 

    public Controller2() { 
     Button navToFirst = new Button("first"); 

     navToFirst.setOnMouseClicked(event -> { 
      Controller1 controller1 = new Controller1(); 
      navToFirst.getScene().setRoot(controller1.getContent()); 
     }); 

     root = new StackPane(navToFirst); 
    } 

    @Override 
    public Parent getContent() { 
     return root; 
    } 
} 
+0

Üzgünüz, isim denetleyicisini yoksayın. Aslında fxml kullanmıyorum –

+0

İlke, FXML kullanıp kullanmadığınızla aynıdır. – jewelsea

+0

Bu bana hata veriyor: 'root null değil –