2016-12-20 4 views
0

Ich bin ein Anfänger-Programmierer und vor kurzem habe ich gelernt, wie man zwischen Szenen in JavaFX wechselt. Ich möchte ein Rahmenfenster (als Container für diese Szenen) mit einigen Menüschaltflächen hinzufügen und Szenen in der Mitte festlegen (und trotzdem zwischen ihnen wechseln können). Was soll ich tun oder denken? Hier ist mein Code:Wie man verschiedene Szenen des Stack-Bereichs in das Root-Layout einstellt JavaFX

public class Main extends Application { 

     public static final String ROOT = "Root"; 
     public static final String ROOT_FXML = "Root.fxml"; 
     public static final String FIRST_SCREEN = "FirstScreen"; 
     public static final String FIRST_SCREEN_FXML = "FirstScreen.fxml"; 
     public static final String SECOND_SCREEN = "SecondScreen"; 
     public static final String SECOND_SCREEN_FXML = "SecondScreen.fxml"; 



     @Override 
     public void start(Stage primaryStage) { 

      ScreensController mainContainer = new ScreensController(); 


      mainContainer.loadScreen(Main.FIRST_SCREEN, Main.FIRST_SCREEN_FXML); 
      mainContainer.loadScreen(Main.SECOND_SCREEN, Main.SECOND_SCREEN_FXML); 
      mainContainer.setScreen(Main.FIRST_SCREEN); 

      Group root = new Group(); 
      root.getChildren().addAll(mainContainer); 
      Scene scene = new Scene(root); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 

     } 
    } 

Interfaceklasse

public interface ControlledScreen { 

    public void setScreenParent(ScreensController screenPage); 
} 

Screens Controller-Klasse

public class ScreensController extends StackPane { 

    private HashMap<String, Node> screens = new HashMap<>(); 

    public void addScreen(String name, Node screen) { 
     screens.put(name, screen); 
     System.out.println("added screen " + name); 
    } 

    public boolean loadScreen(String name, String resource) { 
     try { 
      FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource)); 
      Parent loadScreen = (Parent) myLoader.load(); 
      ControlledScreen myScreenControler = ((ControlledScreen) myLoader.getController()); 
      myScreenControler.setScreenParent(this); 
      addScreen(name, loadScreen); 
      return true; 

     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      return false; 
     } 
    } 

    public boolean setScreen(final String name) { 

     if (screens.get(name) != null) { 
      if (!getChildren().isEmpty()) { 
       getChildren().remove(0); 
       // add new screen 
       getChildren().add(0, screens.get(name)); 
      } else { 
       getChildren().add(screens.get(name)); 
      } 
      return true; 
     } else { 
      System.out.println("screen hasn't been loaded!\n"); 
      return false; 
     } 
    } 

    public boolean unloadScreen(String name) { 
     if (screens.remove(name) == null) { 
      System.out.println("Screen didn't exist"); 
      return false; 
     } else { 
      return true; 
     } 
    } 

} 

Im Moment habe ich zwei Controller-Klassen mit zwei diffrend fxml Dateien. Sie sehen so aus:

public class FirstScreenController implements ControlledScreen { 

    ScreensController myController; 

    @FXML 
    void initialize() { 

    } 

    @Override 
    public void setScreenParent(ScreensController screenPage) { 
     myController = screenPage; 

    } 
} 

Gibt es eine Möglichkeit, meinen Code zu beheben?

+0

Erhalten Sie eine Ausnahme? oder wird gar nichts angezeigt? Wo ist das genaue Problem, das behoben werden sollte? – user7291698

+0

Ich möchte "ersten Bildschirm" oder "zweiten Bildschirm" (und wechseln zwischen ihnen) in der Mitte der "root" (das ist Grenzbereich). Atm Ich kann zwischen dem ersten und zweiten Bildschirm wechseln, aber ich weiß nicht, wie man "root" implementiert – tedunioo24cm

Antwort

0

Ich löste Problem. Hier ist neue Hauptklasse

public class Main extends Application { 

     public static final String ROOT = "Root"; 
    public static final String ROOT_FXML = "Root.fxml"; 
    public static final String FIRST_SCREEN = "FirstScreen"; 
    public static final String FIRST_SCREEN_FXML = "FirstScreen.fxml"; 
    public static final String SECOND_SCREEN = "SecondScreen"; 
    public static final String SECOND_SCREEN_FXML = "SecondScreen.fxml"; 

    private Stage primaryStage; 
    private BorderPane rootLayout; 

    @Override 
    public void start(Stage primaryStage) { 
     this.primaryStage = primaryStage; 
     ScreensController mainContainer = new ScreensController(); 
     initRootLayout(); 

     mainContainer.loadScreen(Main.FIRST_SCREEN, Main.FIRST_SCREEN_FXML); 
     mainContainer.loadScreen(Main.SECOND_SCREEN, Main.SECOND_SCREEN_FXML); 
     mainContainer.setScreen(Main.FIRST_SCREEN); 


     Group root = new Group(); 
     root.getChildren().addAll(mainContainer); 
     rootLayout.setCenter(root); 

    } 

    public void initRootLayout() { 
     try { 
      // Load root layout from fxml file. 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(Main.class.getResource("view/Root.fxml")); 
      rootLayout = (BorderPane) loader.load(); 

      // Show the scene containing the root layout. 
      Scene scene = new Scene(rootLayout); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
Verwandte Themen