2015-05-10 3 views
0

Я в настоящее время делает Java (+, используя MySQL) приложение для моих исследований: База данных для HopitalПолучение переменной из FXML в импортированной FXML

Я закодировать свой интерфейс с помощью JavaFX. У меня есть основной FXML (для общего вида), где у меня есть вкладки, и на каждой вкладке я импортирую другой FXML, используя (fx: include). Так что каждый модуль моего приложения имеет свой собственный контроллер и собственный проект View.

Как передать переменную от главного контроллера к другим контроллерам?

Спасибо! Редактировать: Позвольте мне показать вам мой код

Итак, сначала это класс, в котором я загружаю свой файл fxml (сначала у меня есть окно Connexion, и если информация, необходимая для подключения, в порядке, я загружаю fxml Main с помощью основной интерфейс) и я поставил Connexion (ИЗМЕНЯЕМЫЙ мне нужно отправить), что я получил от моего FXML Connexion к FXML главной

public class MainApp extends Application { 

private Stage primaryStage; 
private Connection conn; 
MainController controllermain = new MainController(); 
//ConnexionController controllerconnex; 

@Override 
public void start(Stage primaryStage) throws Exception { 
    this.primaryStage = primaryStage; 
    this.primaryStage.setTitle("BASE DE L'HOPITAL DU ZOB"); 
    showConnexion(); 
} 

public void showConnexion() { 
    try { 

     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(MainApp.class.getResource("Connexion.fxml")); 
     Parent page = (AnchorPane) loader.load(); 
     Scene scene = new Scene(page); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 

     ConnexionController controller = loader.getController(); 
     controller.setMainApp(this); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void showMainApp(Connection conn) { 
    try { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(MainApp.class.getResource("Main.fxml")); 
     AnchorPane page = (AnchorPane) loader.load(); 
     Scene scene = new Scene(page); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     this.conn = conn; 

     controllermain = loader.getController(); 
     controllermain.setMainApp(this); 
     controllermain.setConnexion(conn); // I want to send the variable conn to the others 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    launch(args); 
} 

}

Тогда это мой главный контроллер, и вы можете видеть, что Я получаю переменную связь только с помощью метода set, а затем могу отправить его другому контроллеру

public class MainController implements Initializable { 


private MainApp mainApp; 
private Button retour; 
protected Connection conn; 


FXML AchorPane ; 

    public MainController() { 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 

}  


public void setMainApp(MainApp mainApp) { 
    this.mainApp = mainApp; 


} 

public void setConnexion(Connection conn){ 

this.conn=conn; 

    } 
public void handleRetour(){ 
         mainApp.showConnexion(); 


    } 
}  


} 

ответ

1

Вам просто нужна ссылка на контроллер, соответствующий включенному fxml в контроллере, соответствующему «главному» fxml. Вы можете сделать это, используя механизм Nested Controllers.

Короче говоря, если у вас есть "главный" FXML с <fx:include> тега, добавьте fx:id к <fx:include>:

Main.fxml:

<!-- imports etc --> 

<!-- root element, e.g. BorderPane --> 
<BorderPane fx:controller="com.example.MainController" xmlns="..." ... > 

<!-- ... --> 

<fx:include source="tab.fxml" fx:id="tab" /> 

<!-- ... --> 
</BorderPane> 

Тогда в MainController вы можете вводить контроллер из включенного fxml, используя @FXML. Правило заключается в том, что вы добавляете слово "Controller" к fx:id, используемому в fx:include. Например, если класс контроллера для tab.fxml является TabController, учитывая fx:id является tab, вы могли бы сделать:

public class MainController { 

    @FXML 
    private TabController tabController ; 

    private Connection conn ; 

    // other injected fields, etc... 

    public void setConnexion(Connection conn) { 
     this.conn = conn ; 
     // pass Connection to TabController: 
     tabController.setConnexion(conn); 
    } 
} 

Теперь просто определить метод setConnexion(...) в TabController (если вы еще не сделали), чтобы получать Connection (и обновить все, что нужно обновить в результате).

+0

Да, спасибо большое! Но если у меня нет переменной, которую я хочу задать до того, как будет вызван метод initialize, это все еще возможно или нет другого пути? –

+0

Поле 'tabController' в примере кода является переменной экземпляра, поэтому оно останется в пределах срока действия« MainController ». Поэтому всякий раз, когда вам нужна переменная, вы можете передать ее в 'tabController'. (Например, если он установлен в обработчике событий, вы можете ссылаться на 'tabController' в обработчике событий.) Вы также можете определить [свойства JavaFX] (http://www.oracle.com/pls/topic/lookup ? ctx = javase80 и id = JFXBD107) в обоих контроллерах и создавать привязки между ними ... Если вы измените свой вопрос, чтобы быть более конкретным, когда значения доступны, я могу обновить ответ. –

+0

Я отредактировал мой вопрос, чтобы вы могли видеть мой код. –

Смежные вопросы