Ok chyba wszystko jasne.
Problemem jest to że do dwóch widoków masz przypisany ten sam kontroler tzn. do createEmailWindow i do MainWindow. To powoduje że w momencie kiedy klikasz finish odwołujesz się do instancji MainController należącej do createEmailWindow, a tam nie ma tabPane co skutkuje że jest on nullem w metodzie finish.
Żeby to rozwiązać najlepiej będzie, według mnie, zrobić całkiem osobny kontroler do createEmailWindow i nie przypisywać go w fxml tylko przypisać go podczas tworzenia w metodzie openCreateEmail w taki sposób:
class EmailCreatorController
{
//kontorlki JavaFX ktore są w craeteEmailWindow z adnotacjami FXML
private MainController mainController;
public EmailCreatorController(MainController mainController)
{
this.mainController = mainController;
}
public void finishButtonCliced()
{
TabPane tabPane = mainController.getTabPane();
FXMLLoader loader = new FXMLLoader( "emailtab.fxml");
Tab tab = loader.load();
tabPane.getTabs().add(tab);
}
}
I teraz MainController:
class MainController
{
//kontorlki javaFX w mainWindow.fxml;
@FXML
private TabPane tabPane;
//inne metody
public void openCreateEmail()
{
FXMLLoader loader = new FXMLLoader( "createEmailWindow.fxml");
loader.setController( new EmailCreatorController( this );
//reszta bez zmian
}
public TabPane getTabPane()
{
return tabPane;
}
}
Dzięki powyższemu w obiekcie EmailCreatorController masz dostęp do właściwego obiektu TabPane. (pamietaj żeby w createEmailWindow.fxml usunąć atrybut fx:controller).