[英]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.