java - JavaFX 节点的父类可以通过访问/确定吗?

标签 java class javafx javafx-8 parent

添加注释:虽然我没有找到解决我所说的问题的干净解决方案,但根本问题是我试图解决“错误的问题”。这是由于在不同的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/

相关文章:

java - 在java字符串文字中转义反斜杠

java - 是否有等同于 "java.awt.headless=true"的 SWT?

java - 有什么方法可以检查给定的类类型是属于 Java 对象还是自定义对象

python - 多继承python问题

java - 新建工程,未生成R.java文件

java - 在 Spring 中启用日志记录

javascript - TypeScript:数组属性在填充时导致此错误: "TypeError: Cannot set property ' 0' of undefined"

java - 使用JAVAFX和SWING有什么区别

java - 在 javaFX 中自动滚动

java - TableView 的样式是怎样的?