在我的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()代码,就是这样。
我整个下午一直在研究EventHandlers,但我发现它要么是超广义的,要么是超特定的,而不是我的情况。任何人都可以就我出错的地方提出任何建议吗?
非常感谢!
答案 0 :(得分:3)
只需在处理程序中添加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++;
}
}
});