我的舞台有 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/