JavaFX - 访问动态创建的选项卡的控制器

时间:2016-01-05 19:15:27

标签: java javafx controller javafx-2 fxml

我的舞台里面有一个std::vector<some_type> foo; // add and remove items from the vector if (!foo.empty()) // do something else // no elements ,其中一个&#34;主要&#34;标签和TabPane tabPane其他标签(HashMap<Connection,Tab> connectionTabs是自定义类)。

我动态实现这些标签。

Connection

现在,在@Override public void connectionCreatedEvent(Connection connection) { try { Tab tab = new Tab(); //... tab.setContent(FXMLLoader.load(getClass().getResource("../fxml/connectionTab.fxml"))); Platform.runLater(() -> { tabPane.getTabs().add(tab); tabPane.getSelectionModel().select(tab); }); connectionTabs.put(connection, tab); } catch (IOException e) { e.printStackTrace(); } } 我声明了一个控制器(connectionTab.fxml)。

如何从此课程中访问此标签控制器?或者我还有另一种方式吗?

我坚持:

ConnectionTabController

我唯一合情合理的是它在@Override public void connectionLogEvent(Connection connection, String msg) { System.out.println("-t-connection log : " + connection + " : " + msg); for(Object o : connectionTabs.entrySet()) { Map.Entry ct = (Map.Entry)o; if(ct.getKey() == connection) /* ???(Tab)ct.getKey().getController();??? */ } } 内(因为我之前已经设置好了),但我仍然无法了解如何达到它,或者甚至是可能的。

非常欢迎任何形式的帮助!

1 个答案:

答案 0 :(得分:1)

您可以在加载FXML时检索控制器:

try {
    Tab tab = new Tab();
    //...
    FXMLLoader loader = new FXMLLoader(getClass().getResource("../fxml/connectionTab.fxml"));
    tab.setContent(loader.load());

    ConnectionTabController controller = loader.getController();

    // ...
}

然后只需将其存储或传递到任何需要的地方。

另一种选择可能是使用this pattern。在这种情况下,你会这样做:

public class ConnectionTab extends Tab {

    // @FXML-annotated controls...


    public ConnectionTab() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("../fxml/connectionTab.fxml"));
            loader.setRoot(this);
            loader.setController(this);
            loader.load();
        } catch (Exception exc) {
            // ...
        }
    }

    // controller methods, etc...
}

将您的fxml更新为

<!-- imports etc ommitted -->

<!-- note no fx:controller.... -->
<fx:root type="javafx.scene.control.Tab" xmlns:fx="...">
    <content>
        <!-- layout here -->
    </content>
</fx:root>

现在在你的其他代码中

@Override
public void connectionCreatedEvent(Connection connection) {
    try {
        ConnectionTab tab = new ConnectionTab();
        //...

        Platform.runLater(() -> {
            tabPane.getTabs().add(tab);
            tabPane.getSelectionModel().select(tab);
        });
        connectionTabs.put(connection, tab);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

现在,connectionTabs地图可让您通过其中的值对象直接访问控制器方法。

请注意,使用此解决方案,如果您需要,可以很容易地将引用传递给ConnectionTab

public class ConnectionTab {

    private final Connection connection ;

    // ...

    public ConnectionTab(Connection connection) {
        this.connection = connection ;
        try {

            // load FXML as before...

        } catch (Exception e) { ... }

    }

    // ...
}