我有一個JavaFX應用程序。主窗口由TabPane(P1)組成。 P1包含4個不同的Tab控件(T11,T12,T13,T14)。 T11包含一個TabPane(P2),其中包含兩個Tab控件(T21,T22)。JavaFX,離開並進入Tab控件
我正在尋找一種簡單的方法來檢測,然後任何Tab控件獲取或失去知名度。使用SelectionModel事件是不夠的。
// LG
我有一個JavaFX應用程序。主窗口由TabPane(P1)組成。 P1包含4個不同的Tab控件(T11,T12,T13,T14)。 T11包含一個TabPane(P2),其中包含兩個Tab控件(T21,T22)。JavaFX,離開並進入Tab控件
我正在尋找一種簡單的方法來檢測,然後任何Tab控件獲取或失去知名度。使用SelectionModel事件是不夠的。
// LG
您可以觀察每個選項卡的selectedProperty
。對於T21和T22,我想你真的想知道是否選擇了T21和T11來確定T21是否可見;這個你只觀察t11.selectedProperty().and(t21.selectedProperty())
:即你可以這樣做
t11.selectedProperty().and(t21.selectedProperty()).addListener(...);
,並提供ChangeListener<Boolean>
。當且僅當選擇t11和t12時,這將是true
,並且如果聽衆將從false
變爲true
或反之亦然,則會通知收聽者。
下面是使用FXML的完整示例。
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class TabSelectionDemo extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
primaryStage.setScene(new Scene(FXMLLoader.load(getClass().getResource("TabSelectionDemo.fxml")), 600, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
TabSelectionDemo.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.Label?>
<TabPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="TabSelectionDemoController" fx:id="p1">
<Tab fx:id="t11" text="T11">
<TabPane fx:id="p2">
<Tab fx:id="t21" text="T21">
<Label text="This is T21"/>
</Tab>
<Tab fx:id="t22" text="T22">
<Label text="This is T22"/>
</Tab>
</TabPane>
</Tab>
<Tab fx:id="t12" text="T12">
<Label text="This is T12"/>
</Tab>
<Tab fx:id="t13" text="T13">
<Label text="This is T13"/>
</Tab>
<Tab fx:id="t14" text="T14">
<Label text="This is T14"/>
</Tab>
</TabPane>
TabSelectionDemoController.java:
import javafx.beans.binding.BooleanBinding;
import javafx.beans.value.ChangeListener;
import javafx.fxml.FXML;
import javafx.scene.control.Tab;
public class TabSelectionDemoController {
@FXML
private Tab t11 ;
@FXML
private Tab t12 ;
@FXML
private Tab t13 ;
@FXML
private Tab t14 ;
@FXML
private Tab t21 ;
@FXML
private Tab t22 ;
private BooleanBinding t21Selected ;
private BooleanBinding t22Selected ;
public void initialize() {
t11.selectedProperty().addListener(createListener("t11"));
t12.selectedProperty().addListener(createListener("t12"));
t13.selectedProperty().addListener(createListener("t13"));
t14.selectedProperty().addListener(createListener("t14"));
t21Selected = t21.selectedProperty().and(t11.selectedProperty()) ;
t22Selected = t22.selectedProperty().and(t11.selectedProperty()) ;
t21Selected.addListener(createListener("t21"));
t22Selected.addListener(createListener("t22"));
}
private ChangeListener<Boolean> createListener(String tabName) {
return (obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
System.out.println(tabName + " gained visible selection");
} else {
System.out.println(tabName + " lost visible selection");
}
};
}
}
我確實試過這個,,「t11.selectedProperty()。和(t21.selectedProperty())。addListener(...);」但它永遠不會觸發我。你測試過你的代碼嗎? –
是的:它運行良好。你是否運行過上面的代碼?也許我不瞭解你在做什麼。已更新以在示例中添加顯式代碼。 –
你理解我很好。我的代碼和你的代碼之間的區別在於你創建標籤的方式。我曾經使用過scenebuilder ,, maby,這有所作爲? –
爲什麼選擇使用模型事件還不夠嗎?這個(和/或每個標籤的'selectedProperty')應該給你所有你需要的信息。 –
那麼,,,我不能讓它工作。問題是,例如,從T12到T11。我可以檢測到這一點。但是,P2不會針對T21或T22發起任何事件。當然,我可以檢測到極其可見的T21或T22,並手動調用一個函數,但代碼我變得混亂。我正在尋找更好的方法? –