2017-07-03 69 views
-2

用戶單擊一個按鈕可打開彈出的第二個場景,該場景允許用戶選擇一些值,然後關閉選區並將其傳遞到第一個場景。將參數從具有自己控制器的彈出窗口場景傳遞到主控制器JavaFX

第一個控制器

Set<String> set; 
public void initialize(URL url, ResourceBundle rb){ 
set = new TreeSet<String>(): 
} 
@FXML 
public Set<String> addValue (MouseEvent e) throws IOException { 
Stage stage = new Stage(); 
root = FXMLoader.load(getClass).getResources(2ndFXML.fxml); 
stage.initModality(Modality.APPLICATION_MODAL); 
stage.iniOwner(clickedButton.getScene().getWindow(); 
stage.showAndWait(): 
return set; 
} 

第二控制器

@FXML 
public void addSelection (MouseEvent e) throws IOException { 
if (event.getSource() == button){ 
    stage = (Stage) button.getScene().getWindow(); 
    set.addAll(listSelection) 
    stage.close 
} 

但值永遠不會使它回到第一個控制器。

+0

因爲你沒有添加任何東西到'Set'!如我錯了請糾正我。用戶從哪裏選擇值?它是一個ListView嗎? – Yahya

+0

在事件處理程序中返回值絕對沒有意義。由於您實際上沒有調用該方法(它是由JavaFX事件處理框架調用的),因此您將永遠無法處理您返回的值。無論如何,'set'是什麼:它在哪裏定義,你在哪裏填充它?你真的想在第一個控制器中用它做什麼? –

+0

更新了這個問題。我將從列表視圖中選擇的內容添加到集合中,並嘗試將其傳遞給第一個控制器 – Moe

回答

2

由於您使用showAndWait(),所有你需要做的是定義在第二控制器的數據的存取方法:

public class SecondController { 

    private final Set<String> selectedData = new TreeSet<>(); 

    public Set<String> getSelectedData() { 
     return selectedData ; 
    } 

    @FXML 
    private void addSelection (MouseEvent e) { 
     // it almost never makes sense to define an event handler on a button, btw 
     // and it rarely makes sense to test the source of the event 
     if (event.getSource() == button){ 
      stage = (Stage) button.getScene().getWindow(); 
      selectedData.addAll(listSelection) 
      stage.close(); 
     } 
    } 

} 

然後在第一個控制器找回它當窗口已經關閉:

@FXML 
public void addValue(MouseEvent e) throws IOException { 

    Stage stage = new Stage(); 
    FXMLLoader loader = new FXMLLoader(getClass().getResource(2ndFXML.fxml)); 
    Parent root = loader.load(); 
    // I guess you forgot this line???? 
    stage.setScene(new Scene(root)); 
    stage.initModality(Modality.APPLICATION_MODAL); 
    stage.iniOwner(clickedButton.getScene().getWindow(); 
    stage.showAndWait(); 

    SecondController secondController = loader.getController(); 
    Set<String> selectedData = secondController.getSelectedData(); 
    // do whatever you need to do with the data... 

} 
+0

我這樣做的方式父根= FXMMLoader.load(getClass().....)但這樣做你的方式我得到一個錯誤無法解析加載?在新的FXMLoader.load(....) – Moe

+0

謝謝詹姆斯,我不知道我可以在關閉舞臺後得到控制器。 – Moe

+0

@Moe您可以在加載FXML後的任何時間獲取控制器。 –

相關問題