2017-04-06 53 views
0

我的應用程序的結構大致與此MainApplication-> SuperFXMLController-> ChildFXMLController類似。每個ChildFXML都有一個按鈕來在SuperFXML中向GridPane添加一個更多的子元素我已經在ChildFXMLController中定義了buttonHandler方法,但是操作本身應該發生在SuperFXMLController(在網格中添加新行)中。問題是如何處理來自SuperFXMLController的操作?嵌入FXML中的訪問操作

這裏一些代碼的細節: AddLogRecordController.java(所謂的 「SuperFXMLController」):

@FXML 
private void initialize() throws IOException { 
rowIndex = 0; 

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

    mainGrid.add(loader.load(), 0, rowIndex++); 
    RecordGridController controller = (RecordGridController) loader.getController(); 
    controller.setSuperController(this); 
} 
... 
public void addRowHandle() { 
    try { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml")); 

     mainGrid.getChildren().add(loader.load()); 
     RecordGridController controller = loader.getController(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

「RecordGridController」 稱爲 「ChildFXMLController」:

private AddLogRecordController superController; 
... 
public void setSuperController(AddLogRecordController addLogRecordControllerClass) { 
    this.superController = addLogRecordControllerClass; 
} 
... 
@FXML 
private void addRowHandler() { 
    superController.addRowHandle(); 
} 

這是結果窗口,在其中被紅色包圍的部分是小孩fxml,應按照按鈕添加到QSO按下的次數複製: And this is result window where the section surrounded by red is a child fxml that should be duplicated as many times as button Add to QSO pressed

+0

使用MVC方法:與子控制器共享數據模型,並觀察父控制器中的數據模型。然後,只需在子控制器的按鈕處理程序中將數據添加到模型中即可。 –

+0

你能解釋一下怎麼做嗎?我是newbuy – brack11

+1

實現的細節將很大程度上取決於您的不同FXML文件和控制器之間的關係。如果你想要一個更具體的答案,你需要在問題中更具體。創建一個示例應用程序 - [MCVE] - 演示您正在嘗試執行的操作,並將其包含在您的問題中。 –

回答

0

好的,現在我已經做好了應該按計劃完成的任務。我在SuperController添加下面的方法:

private void loadRecordGrid(int rowIndex) { 
    try { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml")); 

     mainGrid.add(loader.load(), 0, rowIndex); 
     RecordGridController controller = (RecordGridController) loader.getController(); 
     controller.initialize(this); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

然後方法初始化這樣的:

@FXML 
private void initialize() { 
    rowIndex = 0; 
    loadRecordGrid(rowIndex++); 
} 

和方法addRowHandler這樣的:

在ChildController
public void addRowHandle() { 
    loadRecordGrid(rowIndex++); 
} 

private AddLogRecordController superController; 

@FXML 
public void initialize(AddLogRecordController superController) { 
    this.superController = superController; 
} 


@FXML 
private void addRowHandler() { 
    superController.addRowHandle(); 
} 

不知道,也許它可以做更有效的方式,但現在這個工作。 現在我需要了解如何將文本字段的值從子項傳遞給父項和後項