簡體   English   中英

如何防止JavaFX ListView被預先選擇?

[英]How to prevent JavaFX ListView from being preselected?

我是JavaFX的新手,所以這可能是一個瑣碎的問題。 我在對話框中有一個ListView,該對話框顯示用戶何時單擊菜單按鈕。 問題是當對話框顯示時,ListView中的第一項已被選中。 我有listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<NewChoices>())作為用戶選擇項目時的偵聽器,但是由於已經選擇了第一個項目,因此當我單擊第一個項目時發生。 我需要找到一種方法來確保對話框顯示時未選擇任何項目。 我在顯示對話框之前嘗試使用listView.getSelectionModel().clearSelection() ,但是如果程序丟失然后重新獲得焦點,則無需單擊即可再次選擇第一項。 如何防止第一個項目或與此相關的任何項目被預先選擇?

這是代碼:

    Pane rootPane = new Pane();
    ObservableList<NewChoices> listChoices = FXCollections.observableArrayList(NewChoices.values());
    ListView<NewChoices> listView = new ListView<NewChoices>();
    listView.setItems(listChoices);
    rootPane.getChildren().add(listView);
    Stage newDialog = new Stage(StageStyle.UTILITY);
    newDialog.initModality(Modality.APPLICATION_MODAL);
    newDialog.setTitle("New");
    Scene newDialogScene = new Scene(rootPane);
    newDialog.setScene(newDialogScene);
    newDialog.show();

應該在8u40中修復-參見https://javafx-jira.kenai.com/browse/RT-38517

由於新場景中只有一個列表,沒有按鈕,因此當場景獲得焦點時,由於列表中唯一可聚焦的節點,因此將選擇其第一項。

添加一些“確定/取消”按鈕可能會有所幫助,因為它們可以代替獲得焦點,但是為此,他們需要首先獲得焦點。

這兩個選項均可使用:

  • 首先放置按鈕,使其成為第一個可聚焦節點:

     listView.setItems(listChoices); Button button = new Button("Ok"); VBox rootPane = new VBox(10, button, listView); Stage newDialog = new Stage(StageStyle.UTILITY); newDialog.initModality(Modality.APPLICATION_MODAL); newDialog.setTitle("New"); Scene newDialogScene = new Scene(rootPane); newDialog.setScene(newDialogScene); newDialog.show(); 
  • 暫時刪除列表的focusable屬性:

     listView.setItems(listChoices); listView.setFocusTraversable(false); Button button = new Button("Ok"); VBox rootPane = new VBox(10, listView, button); Stage newDialog = new Stage(StageStyle.UTILITY); newDialog.initModality(Modality.APPLICATION_MODAL); newDialog.setTitle("New"); Scene newDialogScene = new Scene(rootPane); newDialog.setScene(newDialogScene); newDialog.show(); listView.setFocusTraversable(true); 

無論如何,兩者都需要一個額外的節點。 無論如何,您將需要它來關閉模式階段,對嗎?

如果您仍然想不用按鈕,可以使用已解決問題的JDK 8u40早期版本(如@wzberger所指出的那樣),或者如果無法解決,請使用ControlsFX新的Dialogs API(該API的分支JDK 8u40中提供),您將沒有任何問題。

    listView.setItems(listChoices);
    final Dialog dialog = new Dialog();
    dialog.getDialogPane().setContent(listView);

    Optional<ButtonType> result = dialog.showAndWait();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM