JavaFX - 访问动态创建的选项卡 Controller

标签 java javafx controller javafx-2 fxml

我的舞台有 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我声明了一个 Controller ( ConnectionTabController )。

如何从此类访问此选项卡 Controller ?或者我必须采取其他方式吗?

我被困在:

@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();??? */
    }
}

对我来说,它位于 Content 内的某个位置才符合逻辑。 (因为我之前已经设置过),但我仍然不知道如何到达它,或者是否可能。

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

最佳答案

您可以在加载 FXML 时检索 Controller :

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 映射可让您通过其中的值对象直接访问 Controller 方法。

请注意,使用此解决方案,如果您需要的话,可以非常轻松地传递对 ConnectionTab 的引用:

public class ConnectionTab {

    private final Connection connection ;

    // ...

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

            // load FXML as before...

        } catch (Exception e) { ... }

    }

    // ...
}

关于JavaFX - 访问动态创建的选项卡 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34619543/

相关文章:

Java对象定义简写还是快捷方式?

java - 需要帮助为我的 JUnit 测试开发类

java - 为什么我的方法在 System.in.read() 循环后被调用 3 次

javafx - Tab 图形中的 ImageView

multithreading - 如何使用 Rspec stub 线程?

spring - 带有对象参数的模拟 Controller

javascript - 如何在 Angular 中重新加载时重新初始化 View Controller 中的 $scope 变量?

java - LibGdx,渲染计数屏幕上的整数

java - JavaFX 应用程序中的通知

mysql - 上传图像的 javafx 质量