1

JavaFX 2では、Excelファイルを読み取ることでTableViewビーが作成されています。次のようになります。

identification    cellcount    calved
o0001             12345        false
o0002             65432        true
o0003             55555        false
...

ユーザーが[インポート]ボタンを押すと、すべてのレコードをデータベースに追加する必要があります。ただし、「分娩」フィールドの値が「true」の場合、ユーザーが分娩が発生した日付を指定する必要があるダイアログウィンドウを表示します。ここで大きな問題は、ダイアログウィンドウが開いたらすぐにforループのビーイングを一時停止したいということです。私の現在のコードでは、すべてのダイアログウィンドウが互いに積み重ねられています。

これは、FXMLをロードするDialogメソッドです。

public void showDialog(String sURL){
    final Stage myDialog = new Stage();
    myDialog.initStyle(StageStyle.UTILITY);
    myDialog.initModality(Modality.APPLICATION_MODAL);

    URL url = getClass().getResource(sURL);

    FXMLLoader fxmlloader = new FXMLLoader();
    fxmlloader.setLocation(url);
    fxmlloader.setBuilderFactory(new JavaFXBuilderFactory());
    try {
        Node n = (Node) fxmlloader.load(url.openStream());

        Scene myDialogScene = new Scene(VBoxBuilder.create().children(n).alignment(Pos.CENTER).padding(new Insets(0)).build());

        myDialog.setScene(myDialogScene);
        myDialog.show();
    } catch (Exception ex) {
        System.out.println(ex);
    }
}

そして、これが私がテーブルローを処理するforループです:

@FXML
private void handle_ImportCowDataButton(ActionEvent event) {
    Cows selectedCow;

    for(ImportRow row: tblImport.getItems()){
        selectedCow = null;

        for (Cows cow : olCows) {
            if (cow.getOfficial().equals(row.getCownumber())) {
                selectedCow = cow;
            }
        }

        if (selectedCow != null) {
            if (row.getCalving()) {
                //if cow exists and cow has calved, show dialog window loading addcalving.fxml
                //then the for loop should wait until that dialog window is closed before continuing
                Context.getInstance().setPassthroughObject(selectedCow);
                Context.getInstance().showDialog("/GUI/calving/AddCalving.fxml");
            }
        } else {
            //if cow does not exist, show dialog window loading addcow.fxml
            //then the for loop should wait until that dialog window is closed before continuing
            Context.getInstance().setPassthroughObject(selectedFarmer);
            Context.getInstance().showDialog("/GUI/cow/AddCow.fxml");
        }
    }
}

setOnCloseRequest()私の方法で作業するshowDialog()ことはオプションですか?

4

2 に答える 2

1

牛リストをキューなどの別のデータ構造にコピーし、処理中に各牛を削除すると、処理が必要な牛だけが残るため、処理を再開するのは比較的簡単です。

于 2012-11-17T22:50:24.597 に答える
0

答えは私が思ったよりはるかに簡単だったようです。showAndWait()代わりにメソッドを使用してshow()ください。一体どうして私はそれを逃したのだろうか...あなたの助けに感謝します。

メソッドの最終コードshowDialog()

public void showDialog(String sURL){
    final Stage myDialog = new Stage();
    myDialog.initStyle(StageStyle.UTILITY);
    myDialog.initModality(Modality.APPLICATION_MODAL);

    URL url = getClass().getResource(sURL);

    FXMLLoader fxmlloader = new FXMLLoader();
    fxmlloader.setLocation(url);
    fxmlloader.setBuilderFactory(new JavaFXBuilderFactory());
    try {
        Node n = (Node) fxmlloader.load(url.openStream());

        Scene myDialogScene = new Scene(VBoxBuilder.create().children(n).alignment(Pos.CENTER).padding(new Insets(0)).build());

        myDialog.setScene(myDialogScene);
        myDialog.showAndWait();
    } catch (Exception ex) {
        System.out.println(ex);
    }
}
于 2012-11-21T20:20:39.927 に答える