我正在开发一个使用javafx的项目,我遇到了一个我不知道如何解决的问题。我对整个gui事情都很陌生,但这似乎是一个很容易解决的问题,所以我不知道为什么我似乎无法在网上找到任何有用的东西。
该应用程序由许多选项卡组成,我们希望每当选择新选项卡时,选项卡都会在窗格上调用方法。然后,此方法将根据特定选项卡更新组合框或talbelview。
在我们定义选项卡并将它们添加到tabPane的类中,我们可以通过向tabPane添加一个监听器来获取所选选项卡,但我不确定实际的Tab对象是否可以访问窗格上的函数或其他任何可能有用的函数。
我成像解决这个问题的最佳方法是将一个监听器添加到“此选项卡/窗格被选中/对焦”,但我还没有找到类似的东西。
答案 0 :(得分:2)
您可以向需要此类更新的每个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();
}
}
}
});
答案 1 :(得分:0)
如果您查看here,您可以在字段摘要中查找您要查找的事件,即。 SELECTION_CHANGED_EVENT
。只需为每个标签添加此事件的监听器,您就应该是金色的。