2016-12-20 13 views
0

私は初心者のプログラマーであり、最近はJavaFXでシーンを切り替える方法を学びました。私は、いくつかのメニューボタンを備えたBorder Pane(それらのシーンのコンテナとして)を追加し、中央にシーンを設定したい(そしてそれらの間を切り替えられる)。私は何をすべきか考えていますか?私は2つのdiffrendのFXMLファイルを持つ2つのコントローラクラスを持っているスタックペインの異なるシーンをルートレイアウトに設定する方法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(); 

     } 
    } 

インタフェースクラス

public interface ControlledScreen { 

    public void setScreenParent(ScreensController screenPage); 
} 

スクリーンコントローラクラス瞬間

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

} 

: はここに私のコードです。それらは次のようになります:

public class FirstScreenController implements ControlledScreen { 

    ScreensController myController; 

    @FXML 
    void initialize() { 

    } 

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

    } 
} 

私のコードを修正する方法はありますか?

+0

例外がありますか?何も表示されていませんか?解決すべき正確な問題はどこにありますか? – user7291698

+0

私は、 "ルート"(境界線枠)の中心に "最初の画面"または "2番目の画面"(およびそれらの間を切り替える)を設定したいと思います。 Atm私は最初と2番目の画面を切り替えることができますが、私はどのように "ルート" – tedunioo24cm

答えて

0

私は問題を解決しました。ここに新しいメインクラスがあります

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(); 
     } 
    } 
} 
関連する問題