【问题标题】:update field when tab is selected选择选项卡时更新字段
【发布时间】:2017-03-15 04:05:45
【问题描述】:

我正在开发一个使用 javafx 的项目,但遇到了一个我不知道如何解决的问题。我对整个 gui 很陌生,但这似乎是一个很容易解决的问题,所以我不知道为什么我似乎无法在网上找到任何有用的东西。

该应用程序由许多选项卡组成,我们希望这些选项卡在选择新选项卡时调用窗格上的方法。然后,此方法将根据特定选项卡更新组合框或 talbelview。

在我们定义选项卡并将它们添加到 tabPane 的类中,我们可以通过向 tabPane 添加侦听器来获取选定的选项卡,但我不确定实际的 Tab 对象是否可以访问窗格上的功能,或任何其他可能有用的东西。

我认为解决此问题的最佳方法是将侦听器添加到“此选项卡/窗格被选中/处于焦点”中,但我还没有找到类似的东西。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    您可以将Runnable 作为userData 添加到需要此类更新的每个Tab,并使用选择模型向选定的选项卡添加一个侦听器,该侦听器检索用户数据并在选项卡选择更改时触发更新。

    示例

    @Override
    public void start(Stage primaryStage) {
        final Label countLabel = new Label("You visited this tab 0 time(s) before.");
    
        // increments visit count every time the tab is activated
        Runnable labelUpdater = new Runnable() {
    
            private int count = 0;
    
            @Override
            public void run() {
                countLabel.setText("You visited this tab " + (++count) + " time(s) before.");
            }
    
        };
    
        Tab tab1 = new Tab("tab1");
        tab1.setContent(countLabel);
    
        // add runnable as user data
        tab1.setUserData(labelUpdater);
    
        TabPane tabPane = new TabPane(tab1, new Tab("tab2"));
    
        // execute update when a newly selected tab contains a updater 
        tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                Runnable updater = (Runnable) newValue.getUserData();
                if (updater != null) {
                    updater.run();
                }
            }
        });
    
        Scene scene = new Scene(tabPane, 300, 300);
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    如果您更方便,您也可以将更新程序设置为Tab 内容的用户数据:

    //    tab1.setUserData(labelUpdater);
        countLabel.setUserData(labelUpdater);
    
        TabPane tabPane = new TabPane(tab1, new Tab("tab2"));
        tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                Node content = newValue.getContent();
                if (content != null) {
                    Runnable updater = (Runnable) content.getUserData();
                    if (updater != null) {
                        updater.run();
                    }
                }
            }
        });
    

    【讨论】:

      【解决方案2】:

      如果您查看here,您可以在字段摘要下找到您要查找的事件,即。 SELECTION_CHANGED_EVENT。只需为您的每个选项卡添加此事件的侦听器,您就应该是金色的。

      【讨论】:

      • 谢谢,但我无法让它工作。我可以从窗格本身调用它吗?现在我有类似“tabPane.addEventHandler(Tab.SELECTION_CHANGED_EVENT, event -> System.out.println("999"));”的东西。但它似乎不起作用。我从网上找到的方法中得到了 tabPane。它应该可以工作,但我认为有更好的方法(如果我打印 tabPane,它会显示“TabPane@320c2196[styleClass=tab-pane]”)。
      • 我相信您将事件处理程序添加到选项卡本身而不是选项卡窗格。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多