【问题标题】:Javafx EventHandler kicks in when I click a tab... and again when I click another tab当我单击一个选项卡时,Javafx EventHandler 启动......当我单击另一个选项卡时再次启动
【发布时间】:2018-03-08 21:53:07
【问题描述】:

在我的 Javafx 应用程序中,我的选项卡窗格中有许多选项卡。当用户单击选项卡时,我需要更新选项卡显示的内容,因此我找到了以下代码并在选项卡的控制器中使用它:

    tabB.setOnSelectionChanged(new EventHandler<Event>() {
        @Override
        public void handle(Event t) {
            refreshTabBData();
        }
    });

这很好,直到我意识到上面实际上创建了两个事件:第一个是当您单击选项卡时;第二个事件是当您单击不同的选项卡时。我需要在第一次单击目标选项卡时进行刷新。

这是我的代码,简化为一个玩具示例。一、“启动器”类:

package tabsAndListeners;

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class GoGoGo extends Application {

    public void start(Stage primaryStage) {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("TabScreen.fxml"));

        AnchorPane root;
        try {
            root = (AnchorPane) loader.load();
            TabScreenController tsc = loader.getController();
            tsc.start(primaryStage);
            Scene scene = new Scene(root);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) {
                e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

那里没什么特别的。这是 TabScreenController.java:

package tabsAndListeners;

import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Tab;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class TabScreenController {

    @FXML   AnchorPane  anchorPaneRoot;
    @FXML   Tab         tabA, tabB, tabC;

    Stage stage;
    int counter = 0;

    public void start(Stage stage){
        this.stage = stage;

        tabB.setOnSelectionChanged(new EventHandler<Event>() {
            @Override
                public void handle(Event t) {
                    // refreshTabBData();
                    System.out.println("tabB.setOnSelectionChanged() :: counter is now: "+counter);
                    counter++;
            }
        });
    }
}

最后是 FXML,“TabScreen.fxml”:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane fx:id="anchorPaneRoot" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="tabsAndListeners.TabScreenController">
   <children>
      <TabPane layoutX="10.0" layoutY="70.0" prefHeight="324.0" prefWidth="576.0" tabClosingPolicy="UNAVAILABLE">
        <tabs>
          <Tab fx:id="tabA" text="Tab A">
            <content>
              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
            </content>
          </Tab>
          <Tab fx:id="tabB" text="Tab B">
            <content>
              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
            </content>
          </Tab>
            <Tab fx:id="tabC" text="Tab C">
              <content>
                <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
              </content>
            </Tab>
        </tabs>
      </TabPane>
   </children>
</AnchorPane>

所以当我运行这个时,然后依次单击 TabA、TabB、TabC、TabC、TabB、TabA、TabC。这是输出:

tabB.setOnSelectionChanged() :: counter is now: 0     // I clicked on TabB
tabB.setOnSelectionChanged() :: counter is now: 1     // I clicked on TabC
tabB.setOnSelectionChanged() :: counter is now: 2     // I clicked on TabB
tabB.setOnSelectionChanged() :: counter is now: 3     // I clicked on TabA

你看到了问题。当我单击 TabB 时调用 refreshTabBData() 代码...我不想要第二个事件。我希望仅在单击 TabB 时调用 refresh() 代码,就是这样。

我整个下午都在研究事件处理程序,但我发现它的所有内容要么是超概括的,要么是超具体的,与我的情况无关。任何人都可以就我哪里出错提供任何建议吗?

非常感谢!

【问题讨论】:

    标签: javafx tabs click eventhandler


    【解决方案1】:

    只需在处理程序中添加if 语句:

    tabB.setOnSelectionChanged(new EventHandler<Event>() {
        @Override
        public void handle(Event t) {
            if (tabB.isSelected()) {
                // refreshTabBData();
                System.out.println("tabB.setOnSelectionChanged() :: counter is now: "+counter);
                counter++;
            }
        }
    });
    

    【讨论】:

    • 啊。詹姆斯,你又救了我。这是一个超级简单的解决方案,但我从来没有想过……非常感谢
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 2020-08-13
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多