2017-08-22 38 views
1

私はFXMLが新しく、TabPanesで私のトラブルの解決策を見つけるために多くを探しました。以下の例では(JavaFX: Adding a new tab from a tab controllerの例に基づいて)、TapPaneにいくつかのタブを追加したい - 「included」タブ(タブ1)の中から新しいタブを追加することは問題ではないが、動的に作成されたタブ(タブ2など)の中からタブを選択すると、常にNullPointerExceptionが発生します。 誰でも、動的に作成されたタブ(タブ2)の中からFirstTab-Controllerにアクセスする方法を教えてください。動的に追加されたタブの中からTabPaneにアクセスする

TestingTabPane.java:

package testingtabs; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 


public class TestingTabPane extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("FirstTab.fxml")); 

     Scene scene = new Scene(root); 

     stage.setScene(scene); 
     stage.show(); 
    } 

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

} 

FirstTab.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<TabPane fx:id="myTabPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testingtabs.FirstTabController"> 
    <tabs> 
    <Tab fx:id="FirstTab" text="Tab 1"> 
     <fx:include source="NewTab.fxml" fx:id="newTab"/> 
    </Tab> 
    </tabs> 
</TabPane> 

FirstTabController.java:

package testingtabs; 

import java.io.IOException; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 

public class FirstTabController { 

    @FXML 
    public TabPane myTabPane; 

    @FXML 
    public NewTabController newTabController; 

    public void initialize() { 
     newTabController.setMainWindowController(this); 
    } 

    public void createTab() throws IOException { 
     int numTabs = myTabPane.getTabs().size(); 
     Tab tab = new Tab("Tab " + (numTabs + 1)); 
     Parent root = FXMLLoader.load(getClass().getResource("NewTab.fxml")); 
     tab.setContent(root); 
     myTabPane.getTabs().add(tab); 

    } 
} 

NewTab.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 


<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="testingtabs.NewTabController"> 
    <children> 
     <Button fx:id="addTabBtn" layoutX="268.0" layoutY="187.0" mnemonicParsing="false" onAction="#onAddTabBtnClicked" text="add tab" /> 
    </children> 
</AnchorPane> 

NewTabController.java:

package testingtabs; 

import java.io.IOException; 
import javafx.fxml.FXML; 

public class NewTabController { 

    private FirstTabController firstTabController ; 

    public void setMainWindowController(FirstTabController mainWindowController) { 
     this.firstTabController = mainWindowController ; 
    } 

    @FXML 
    public void onAddTabBtnClicked() throws IOException { 
     firstTabController.createTab(); 
    } 
} 

答えて

1

あなたはその新しく作成されたタブのコンテンツのためのコントローラにsetMainWindowController(...)を呼び出すことはありませんcreateTab()方法、を経由して「動的」タブをロードします。そのコントローラでは、firstTabControllerはまだnullであり、​​メソッドでNull Pointer Exceptionを取得します。

あなたはあなたが本当に他の人に異なった最初のタブを治療する必要はありません

public void createTab() throws IOException { 
    int numTabs = myTabPane.getTabs().size(); 
    Tab tab = new Tab("Tab " + (numTabs + 1)); 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("NewTab.fxml")); 
    Parent root = loader.load(); 
    NewTabController newTabController = loader.getController(); 
    newTabController.setMainWindowController(this); 
    tab.setContent(root); 
    myTabPane.getTabs().add(tab); 
} 

を行うことができます。あなたは、単に少しのコードを減らす(および全体で一貫性のある技術を使用して)、最初のものを作るためにinitialize()からcreateTab()メソッドを呼び出すことができます。

FirstTab.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<TabPane fx:id="myTabPane" maxHeight="-Infinity" maxWidth="-Infinity" 
    minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" 
    prefWidth="600.0" tabClosingPolicy="UNAVAILABLE" 
    xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" 
    fx:controller="testingtabs.FirstTabController" /> 

をFirstTabController:

package testingtabs; 

import java.io.IOException; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 

public class FirstTabController { 

    @FXML 
    public TabPane myTabPane; 

    public void initialize() { 
     createTab(); 
    } 

    public void createTab() throws IOException { 
     int numTabs = myTabPane.getTabs().size(); 
     Tab tab = new Tab("Tab " + (numTabs + 1)); 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("NewTab.fxml")); 
     Parent root = loader.load(); 
     NewTabController newTabController = loader.getController(); 
     newTabController.setMainWindowController(this); 
     tab.setContent(root); 
     myTabPane.getTabs().add(tab); 
    } 
} 

NewTab.fxmlNewTabControllerは同じです。

+0

Phew! - 詳細な回答James_D - は大変ありがとうございます:)問題で1週間ほど過ごしてしまいましたが、最後に大惨事に遭遇しました;) - あなたの解決策は私には大いに役立ちます:) – Guenter

関連する問題