2016-08-19 69 views
2

我在問這個問題之前在任何地方尋找解決方案,如果它已經存在請報告它。JavaFX,在標籤之間傳遞參數控制器

在實踐中我有這種情況:

CLICK TO VIEW THE IMAGE

TabLayout.fxml

<JFXTabPane fx:id="tabbedPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefWidth="500.0" tabClosingPolicy="UNAVAILABLE" tabMinWidth="100.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.TAB.TabController" stylesheets="@tab.css"> 
<tabs> 
    <Tab id="anagrafeTab" closable="false" text="Anagrafe"> 
    <content> 
     <fx:include fx:id="anagrafeL" source="/application/Anagrafe/AnagrafeLayout.fxml"/> 
    </content> 
    </Tab> 
    <Tab id="visiteTab" closable="false" text="Visite"> 
    <content> 
     <fx:include fx:id="visiteL" source="/application/Visite/VisiteLayout.fxml"/> 
    </content></Tab> 
    <Tab id="latteTab" closable="false" text="Produzione Latte"> 
    <content> 
     <fx:include fx:id="latteL" source="/application/Latte/LatteLayout.fxml"/> 
    </content> 
    </Tab> 
    <Tab id="partiTab" closable="false" text="Parti" > 
    <content> 
     <fx:include fx:id="partiL" source="/application/Parti/PartiLayout.fxml"/> 
    </content> 
    </Tab> 
</tabs> 
</JFXTabPane> 

用於每一個 「包括」 佈局:

  • AnagrafeLayout.fxml
  • VisiteLayout.fxml
  • LatteLayout.fxml
  • PartiLayout.fxml

比我有一個模型,併爲每一個佈局的控制,但一個唯一調用。

public class Tab { 

public Tab() { 
    inizializza(); 
} 

private void inizializza() { 
    try { 
     Stage stage = new Stage(); 
     stage.setTitle("Dati"); 
     stage.getIcons().add(new Image(getClass().getResourceAsStream("insert.png"))); 

     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(getClass().getResource("TabLayout.fxml")); 
     JFXTabPane root = (JFXTabPane) loader.load(); 

     Scene scene = new Scene(root,660,430); 
     stage.setScene(scene); 

     stage.show(); 
     //ScenicView.show(scene); 

    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    } 
} 

我需要將ObservableList<Visite> data = FXCollections.observableArrayList();傳遞給每個控制器。

我真的不知道該怎麼做,我不會使用單個控制器,因爲他們是相當長的類。

編輯:

TABController.java

public class TabController implements Initializable { 

@FXML 
private TabPane tabbedPane; 

@Override 
public void initialize(URL arg0, ResourceBundle arg1) { 
    assert tabbedPane != null : "fx:tabbedPane=\"in\" was not injected: check your FXML file 'TabLayout.fxml'."; 

    tabbedPane.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> { 

     if(tabbedPane.getSelectionModel().getSelectedIndex() != 0) { 
      tabbedPane.getScene().getWindow().setWidth(1171); 
      tabbedPane.getScene().getWindow().setHeight(700); 
     } else { 
      tabbedPane.getScene().getWindow().sizeToScene(); 
     }   
    }); 
    } 
} 

EDIT2

的4個選項卡有,如上面提到的,每一個他自己的模型類。 所以我有4個不同的列表,它們最初是空的,因爲它們是動態填充的,因爲每個選項卡都有一個表。 當tabPane由不同的實習調用時,將創建列表。 我需要這些列表,因爲它可能是以前的負載的可能性,我必須將這些信息傳遞給控制器​​。

在實踐中,這種情況發生:

1)

呼叫創建從該選項卡中加載表格空列表功能插件。這些數據將在最後存儲在數據庫中。

2)

調用功能顯示調用該函數插入件與創建列表和從數據庫中獲取數據並將其發送到隨後可以修改表的特定標誌。

我希望我是清楚的,我很抱歉,對於這個問題的不確定性先

現在我解決這樣

public class TabController implements Initializable { 

@FXML 
private TabPane tabbedPane; 

@FXML 
private VisiteController visiteLController; 
private ObservableList<Visite> dataVisite = FXCollections.observableArrayList(); 
private ObservableList<Visite> dataDelVisite = FXCollections.observableArrayList(); 

@FXML 
private LatteController latteLController; 
private ObservableList<Latte> dataLatte = FXCollections.observableArrayList(); 
private ObservableList<Latte> dataDelLatte = FXCollections.observableArrayList(); 

@FXML 
private PartiController partiLController; 
private ObservableList<Parti> dataParti = FXCollections.observableArrayList(); 
private ObservableList<Parti> dataDelParti = FXCollections.observableArrayList(); 


@Override 
public void initialize(URL arg0, ResourceBundle arg1) { 
    assert tabbedPane != null : "fx:tabbedPane=\"in\" was not injected: check your FXML file 'TabLayout.fxml'."; 

    tabbedPane.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> { 

     if(tabbedPane.getSelectionModel().getSelectedIndex() != 0) { 
      tabbedPane.getScene().getWindow().setWidth(1171); 
      tabbedPane.getScene().getWindow().setHeight(700); 
     } else { 
      tabbedPane.getScene().getWindow().sizeToScene(); 
     }   
    });  

    visiteLController.setData(dataVisite, dataDelVisite); 
    latteLController.setData(dataLatte, dataDelLatte); 
    partiLController.setData(dataParti, dataDelParti); 
} 
} 

和設置方法爲每個控制器

明顯變化
public void setData(ObservableList<Visite> data, ObservableList<Visite> dataDel) { 
    this.data = data; 
    this.dataDel = dataDel; 
    liveSearh(); 
} 
+1

你可以發佈'TabController'的代碼嗎?這看起來像http://stackoverflow.com/questions/37068243/share-model-with-nested-controller –

+0

增加:) 現在我回頭看看鏈接 –

+0

請澄清問題。每個控制器都需要什麼,以及您在哪裏創建每個需要的數據,或者有權訪問這些數據? –

回答

0

也許這裏最好的選擇是使用controller factory,這樣當你創建時,你可以將這個列表傳遞給控制器。

因此,首先,定義所有的控制器,使他們有一個構造採取觀察的名單:

public class TabController implements Initializable { 

    private final ObservableList<Visite> data ; 

    public TabController(ObservableList<Visite> data) { 
     this.data = data ; 
    } 

    // existing code... 
} 

,例如,

public class AnagrafeController implements Initializable { 

    private final ObservableList<Visite> data ; 

    public AnagrafeController(ObservableList<Visite> data) { 
     this.data = data ; 
    } 

    // existing code... 
} 

現在你需要一個控制器工廠,基本上是一個函數,需要一個Class並返回該類的控制器。這只是需要一點反思:

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource("TabLayout.fxml")); 

ObservableList<Visite> data = FXCollections.observableArrayList(); 

loader.setControllerFactory((Class<?> controllerType) -> { 
    try { 
     Constructor<?>[] constructors = controllerType.getConstructors(); 
     for (Constructor<?>[] constructor : constructors) { 
      if (constructor.getParameterCount() == 1 && 
       constructor.getParameterTypes()[0] == ObservableList.class) 

       return constructor.newInstance(data); 
      } 
     } 

     // no suitable constructor found, just use default: 
     return controllerType.newInstance(); 

    } catch (Exception exc) { 
     System.out.println("Could not create controller:"); 
     exc.printStackTrace(); 
     return null ; 
    } 
}); 

JFXTabPane root = loader.load(); 

// ... 

這將創建一個可觀察的名單(data)和控制器工廠將確保如果控制器類有一個構造以可觀察到的列表作爲參數,data在爲傳遞該參數。

當您使用<fx:include>時,使用相同的控制器工廠爲包含的FXML文件創建控制器,因此假設您定義了合適的構造函數,同樣的列表也會傳遞給這些控制器。

你也可以考慮一個依賴注入框架,這基本上可以自動將對象注入你的控制器。 Afterburner.fx是一個非常好的JavaFX依賴注入框架。

+0

好吧,Tab控制器不需要數據列表,但是,對於每個控制器,我必須給出不同的列表。 我應該爲每個控制器類創建一個工廠控制器嗎? 如果我發送兩個列表而不是一個? 我等待您的回覆,同時我將自己定位於您發送給我的鏈接中的解決方案;即在TabController類中,我聲明瞭各種控制器類的控制器,並且我調用了存在於不同控制器類中的setter。 –

+1

好的,我認爲問題是你需要在不同的控制器之間共享數據。如果你有權訪問'TabController'中的列表,爲什麼不在每個其他控制器中定義一個'setData(...)'方法,並從'TabController'的'initialize()'方法? –

+0

是我最初的解決方案,僅僅是因爲我的錯誤而無效:我沒有正確聲明控制器變量的名稱。 我注意到你在開始時給我的鏈接:) –

相關問題