2017-06-20 6 views
0

をキャンセルselectedItemPropertyChanged:「?あなたは、新しい値を選択したい」とのメッセージボックスだけポップは、私が問題にしている次のイベント

listView.getSelectionModel().selectedItemProperty().addListener((obs, oldV, newV) -> { 
      if (!selectionChanged(newV)) { 
       lististView.getSelectionModel().select(oldV); 
      } 

    }); 

selectionChanged(newV)ブール値として結果を返します。キャンセルをクリックするとfalseが返され、条件がtrueになります。しかし、.select(oldV)のため。ループの結果になります。どうすればjavafx listviewで選択を取り消したりロールバックしたりできますか?

答えて

2

ブール値フラグを作成し、設定されていないかどうかをユーザーに確認しないでください。選択モデルのselectedItemsリスト(基本的には別のリスト変更が処理されている間はリストを変更することはできません)で競合する問題を避けるために、Platform.runLater(...)で元の値に変更を元の値に戻す必要があります。

private boolean checkSelectionChange = true ; 

// ... 

listView.getSelectionModel().selectedItemProperty().addListener((obs, oldV, newV) -> { 

    if (checkSelectionChange) { 
     checkSelectionChange = false ; 
     Platform.runLater(() -> { 
      if (!selectionChanged(newV)) { 
       lististView.getSelectionModel().select(oldV); 
      } 
      checkSelectionChange = true ; 
     }); 
    } 
}); 

SSCCE:

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.scene.Scene; 
import javafx.scene.control.Alert; 
import javafx.scene.control.Alert.AlertType; 
import javafx.scene.control.ButtonType; 
import javafx.scene.control.ListView; 
import javafx.stage.Stage; 

public class ListViewSelectionUserVeto extends Application { 

    private boolean checkSelectionChange = true ; 

    @Override 
    public void start(Stage primaryStage) { 
     ListView<String> listView = new ListView<>(); 
     listView.getItems().addAll("One", "Two", "Three", "Four"); 
     listView.getSelectionModel().selectedItemProperty().addListener((obs, oldValue, newValue) -> { 
      if (checkSelectionChange) { 
       checkSelectionChange = false ; 
       Platform.runLater(() -> { 
        if (! verifySelectionChange(newValue)) { 
         listView.getSelectionModel().select(oldValue); 
        } 
        checkSelectionChange = true ; 
       }); 
      } 
     }); 

     Scene scene = new Scene(listView); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private boolean verifySelectionChange(String newValue) { 
     Alert alert = new Alert(AlertType.CONFIRMATION); 
     alert.setContentText("Change selection to "+newValue); 
     return alert.showAndWait().filter(ButtonType.OK::equals).isPresent(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

メッセージボックスが二回表示されます。 – Sduniii

+0

@Sduniii(Platform.runLater(...)で)更新された答えを使用していますか?これはSSCCEで起こっていますか? –

+0

ok私のせいです。私はa.showAndWait()を追加しました。isPresent()&& a.showAndWait()。get()!= ButtonType.OKボックスを2回呼びました。どうも – Sduniii