2016-12-20 1 views
0

Je suis un programmeur débutant et récemment j'ai appris à basculer entre les scènes dans JavaFX. Je voudrais ajouter un panneau de bordure (comme un conteneur pour ces scènes) avec quelques boutons de menu, et placer des scènes au centre (et être toujours capable de basculer entre eux). Que devrais-je faire ou penser? Voici mon code:Comment régler les différentes scènes du volet de la pile dans la disposition racine 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(); 

     } 
    } 

classe Interface

public interface ControlledScreen { 

    public void setScreenParent(ScreensController screenPage); 
} 

écrans classe contrôleur

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; 
     } 
    } 

} 

Au moment où j'ai deux classes de contrôleur avec deux fichiers FXML de diffrend. Ils ressemblent à ceci:

public class FirstScreenController implements ControlledScreen { 

    ScreensController myController; 

    @FXML 
    void initialize() { 

    } 

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

    } 
} 

Y at-il un moyen de réparer mon code?

+0

Avez-vous une exception? ou rien n'est affiché? Où est le problème exact qui devrait être résolu? – user7291698

+0

Je voudrais définir "premier écran" ou "deuxième écran" (et basculer entre eux) dans le centre de la "racine" (qui est le volet frontière). Je peux basculer entre le premier et le second écran mais je ne sais pas comment implémenter "root" – tedunioo24cm

Répondre

0

J'ai résolu le problème. Voici une nouvelle classe principale

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(); 
     } 
    } 
}