2014-10-31 93 views
0

我是JavaFX的新手,所以這可能是一個微不足道的問題。在對話框中有一個ListView,用於顯示用戶何時單擊菜單按鈕。問題是,當對話框顯示時,ListView中的第一項已被選中。我有listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<NewChoices>())作爲用戶選擇一個項目時的監聽器,但由於第一個項目已被選中,所以當我點擊第一個項目時什麼也沒有發生。我需要找到一種方法來確保在對話框顯示時沒有選擇任何項目。在顯示對話框之前,我嘗試使用listView.getSelectionModel().clearSelection(),但是如果程序丟失,然後重新獲得焦點,則第一個項目再次被選中而不被點擊。我怎樣才能預先選擇第一個項目或任何項目?如何防止預先選擇JavaFX ListView?

下面是代碼:

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(); 
+0

你用什麼API來顯示對話框? JDK8_40? ControlsFX?自定義場景?除了該對話框上的列表,還有其他控件嗎? – 2014-10-31 22:01:59

+0

我正在使用JDK8_24。我現在遠離我的電腦,所以我不記得確切的一個,但它是JDK8_2的東西。不,它只是對話框中的列表視圖。 – user2793426 2014-10-31 22:46:32

+0

由於在8u40之前還沒有對話框,我認爲你所謂的對話只是一個普通的場景。如果你只有一個列表(沒有按鈕來關閉所謂的對話框?),我的猜測是當場景獲得焦點時,因爲唯一的可聚焦節點是列表,所以它的第一個項目被選中。添加一些確定/取消按鈕可能會有所幫助,因爲它們可以獲得焦點。也許你可以添加一個[MCVE](http://stackoverflow.com/help/mcve)。 – 2014-10-31 23:01:44

回答

0

既然你對你的新場景只有一個列表,沒有按鈕,當現場獲得的焦點,作爲唯一的可聚焦節點是列表,它的第一個項目被選中。

添加一些確定/取消按鈕可能有幫助,因爲他們可以獲得焦點,但爲此,他們需要首先獲得焦點。

任何的這兩個選項將工作:

  • 第一把按鈕,這樣它的第一個可聚焦點:

    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(); 
    
  • temporaly刪除列表中的可聚焦特性:

    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 new Dialogs API將在JDK 8u40中發佈的API),並且您不會遇到任何問題。

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

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

我不需要額外的節點來關閉模態階段。它已經有一個退出按鈕。理想情況下,我不必有一個額外的節點。你確定沒有其他解決方法嗎? – user2793426 2014-11-15 22:11:41

+0

我沒看到那個按鈕,你把它放在哪裏? – 2014-11-15 22:13:06

+0

我沒有把它放在自己身上,它會自動在那裏,就像常規舞臺上的最大化/最小化按鈕一樣。 – user2793426 2014-11-15 22:18:11