添加注释:虽然我没有找到解决我所说的问题的干净解决方案,但根本问题是我试图解决“错误的问题”。这是由于在不同的JavaFX对象上调用initialize()的时间,并且很快变得丑陋(即,如果/当GridPane在Tab上设置适当的值之前访问Tab时会发生什么?)。真正的解决方案是退后一步,重新评估实现,并在正确填充 Tab 的值后,在 Tab 的 GridPane 上使用 setUserData()。虽然还是有点杂乱,但比我最初尝试的要干净和可靠得多,这需要下面要求的解决方案。
我正在向选项卡添加 GridPane,并且需要访问 Tab.getText()。在GridPane 的initialize() 中,我可以使用GridPane.getParent() 获取Parent。但是,Parent 没有实现 getText(),我不能实现 ( Tab )Parent,也不能使用 instanceof。
我已经找到了访问 GridPane Controller 的机制,但除非有必要,否则我真的不想这样做(即,我希望 GridPane 实例在没有外部刺激的情况下做“正确的事情”)。
我知道下面的代码片段无法编译/运行,但是有没有一种干净的方法来实现代码背后的想法?
@FXML private GridPane gridPane;
@FXML
public void initialize() {
Parent parent = gridPane.getParent();
if (parent instanceof Tab) {
String foo = (( Tab )parent).getText();
}
}
最佳答案
没有特别干净的方法来做到这一点。将选项卡放置在场景等中后,您可以迭代节点层次结构,直到找到选项卡 Pane ,然后迭代选项卡 Pane 的选项卡列表并查看内容是否与节点匹配。例如:
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.stage.Stage;
public class TabPaneTest extends Application {
@Override
public void start(Stage primaryStage) {
TabPane pane = new TabPane();
Tab tab = new Tab("Test tab");
Label label = new Label("Test Label");
tab.setContent(label);
pane.getTabs().addAll(tab);
primaryStage.setScene(new Scene(pane));
primaryStage.show();
for (Node n = label ; n != null ; n = n.getParent()) {
if (n instanceof TabPane) {
System.out.println("Found Tab Pane...");
for (Tab t : ((TabPane)n).getTabs()) {
if (t.getContent() == label) {
System.out.println("Tab containing label: "+t.getText());
}
}
}
}
}
public static void main(String[] args) {
launch(args);
}
}
不过,您可能想找到更好的方法来做到这一点。例如。您可以直接注入(inject)选项卡而不是(或同时)注入(inject)网格 Pane 吗?似乎无论您需要做什么,都应该在“了解”选项卡的级别上进行处理。最坏的情况下,您可以设置 user data网格 Pane 的文本到选项卡的文本。但这感觉就像一个 x-y problem :你根本不需要这样做。
关于java - JavaFX 节点的父类可以通过访问/确定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455335/