2015-05-26 41 views
0

我有一個JavaFX應用程序。主窗口由TabPane(P1)組成。 P1包含4個不同的Tab控件(T11,T12,T13,T14)。 T11包含一個TabPane(P2),其中包含兩個Tab控件(T21,T22)。JavaFX,離開並進入Tab控件

我正在尋找一種簡單的方法來檢測,然後任何Tab控件獲取或失去知名度。使用SelectionModel事件是不夠的。

// LG

+0

爲什麼選擇使用模型事件還不夠嗎?這個(和/或每個標籤的'selectedProperty')應該給你所有你需要的信息。 –

+0

那麼,,,我不能讓它工作。問題是,例如,從T12到T11。我可以檢測到這一點。但是,P2不會針對T21或T22發起任何事件。當然,我可以檢測到極其可見的T21或T22,並手動調用一個函數,但代碼我變得混亂。我正在尋找更好的方法? –

回答

0

您可以觀察每個選項卡的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"); 
      } 
     }; 
    } 

} 
+0

我確實試過這個,,「t11.selectedProperty()。和(t21.selectedProperty())。addListener(...);」但它永遠不會觸發我。你測試過你的代碼嗎? –

+0

是的:它運行良好。你是否運行過上面的代碼?也許我不瞭解你在做什麼。已更新以在示例中添加顯式代碼。 –

+0

你理解我很好。我的代碼和你的代碼之間的區別在於你創建標籤的方式。我曾經使用過scenebuilder ,, maby,這有所作爲? –