我的舞台里面有一个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();??? */
}
}
内(因为我之前已经设置好了),但我仍然无法了解如何达到它,或者甚至是可能的。
非常欢迎任何形式的帮助!
答案 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) { ... }
}
// ...
}