2012-05-25 63 views
3

我正在使用2個不同的BorderPanes,BorderPane A和BorderPane B編寫應用程序。 該應用程序有2個菜單項,單擊它時將顯示BorderPane A或BorderPane B.如何從JavaFX應用程序類別檢索舞臺

這是應用程序類,它有我想使用

public class SampleApp extends Application { 
private Stage primaryStage; 

public static void main(final String[] args) { 
    launch(args); 
}  
@Override 
public void start(final Stage stage) 
     throws Exception { 
    final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SampleAppFactory.class); 
    final SpringFxmlLoader loader = new SpringFxmlLoader(context);  
    final Parent root = (Parent) loader.load("Main.fxml", Main.class); 
    final Scene scene = new Scene(root, 600, 480, Color.ALICEBLUE); 
    this.primaryStage = stage; 
    scene.getStylesheets().add("fxmlapp.css"); 
    stage.setScene(scene); 
    stage.show(); 
} 
} 

的Main.java類有兩個BorderPanes的階段,當菜單項被選擇我想顯示上應用程序的borderpane。

是否有人知道如何使用此方法顯示Borderpane(設置舞臺場景)(showBorderPane)? 我想找回舞臺上,並設定德borderpane場景:

public class Main extends BorderPane implements Initializable { 

@FXML 
private Verbinding verbindingContent; // BORDERPANE A 
@FXML 
private Beheer beheerContent;// BORDERPANE A 
@FXML 
private MenuBar menuContent; 

@Override 
public void initialize(final URL url, final ResourceBundle rb) { 
    System.out.println(url); 
    menuContent.setFocusTraversable(true); 
} 

@FXML 
private void showBorderPane(final ActionEvent event) { 
    final MenuItem menuItem = (MenuItem) event.getSource(); 
} 


@FXML 
private void handleCloseAction(final ActionEvent event) { 
    System.exit(0); 
} 

}

我的main.xml

<?xml version="1.0" encoding="UTF-8"?> 
<?import java.lang.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.shape.*?> 
<?import javafx.scene.effect.*?> 
<?import nl.mamaloe.tab.view.Main?> 
<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="nl.mamaloe.tab.view.Main"> 
<fx:define>  
    <fx:include source="scene/Beheer.fxml" fx:id="beheerContent" /> 
    <!-- fx:include source="Menu.fxml" fx:id="menuContent"/--> 
</fx:define> 
<top> 
    <MenuBar fx:id="menuContent" onMouseClicked="#handleKeyInput"> 
     <menus> 
      <Menu text="Systeem"> 
       <items> 
        <MenuItem text="Verbinding maken" onAction="#handleVerbindingAction"/> 
        <SeparatorMenuItem /> 
        <MenuItem text="Afsluiten" onAction="#handleCloseAction"/> 
       </items> 
      </Menu> 

      <Menu text="TAB"> 
       <items> 
        <MenuItem text="Script toevoegen" onAction="#handleAboutAction"/> 
        <SeparatorMenuItem /> 
        <MenuItem text="Script draaien" />      
       </items> 
      </Menu> 
      <Menu text="About" onAction="#handleAboutAction"> 
       <items> 
        <MenuItem text="Op basis van wizard" /> 
       </items> 
      </Menu> 
     </menus> 
    </MenuBar> 
</top> 
<center> <Label text="Add New Dock of Home" /> 

</center> 

我已經看到它是可能會從應用程序的啓動方法中執行此操作。 但我想在Main.java中實現它,因爲結構,我主要使用FXML來聲明GUI。

回答

1

當FXMLLoader加載「Main.fxml」文件時,會創建一個新的BorderPane(在Main.fxml中定義)。加載器還創建/初始化其控制器類,這是另一個帶有自己實例的BorderPane派生類。所以有兩個不同的BorderPanes實例。你的設計是通用的方法有些不同,來實現自己的目標,我建議增加一個集裝箱到中心FXML文件是這樣的:

<center> 
    <StackPane fx:id="pane"> 
     <children> 
       <Label text="Add New Dock of Home" /> 
     </children> 
    </StackPane> 
</center> 

你可以用任何你想要的窗格/佈局改變StackPane。 接下來讓控制器類到它的鏈接:

@FXML 
private StackPane pane; 

,你應該刪除「擴展BorderPane」,因爲它是沒有任何意義了。最後,

@FXML 
private void showBorderPane(final ActionEvent event) { 
    final MenuItem menuItem = (MenuItem) event.getSource(); 
    pane.getChildren().clear(); // Clear old content. 
    switch (menuItem.getText()) { 
     case "Borderpane A": 
      pane.getChildren().add(borderPaneA); 
      break; 
     case "Borderpane B": 
      pane.getChildren().add(borderPaneB); 
      break; 
     default: 
      pane.getChildren().add(new Label("Add New Dock of Home")); 
    } 
} 
+0

我似乎只想在第一個例子中只顯示borderPane的中心。但這似乎並不奏效。 因爲當我調用this.getScene();從shoBorderPane方法 我得到一個空指針異常,我之前嘗試過,因爲我也認爲主要的Borderpane應該有一個場景。或者我在做什麼? – Firebird

+0

我不明白。兒童邊界線已經在主邊界線內。你爲什麼試圖讓它們重新居中?而在你的情況this.setCenter()就夠了,不需要this.getScene()。 –

+0

另外附上你的main.fxml以更好地理解。 –