如何防止JavaFXListView被预选?

如何防止JavaFXListView被预选?,java,listview,user-interface,javafx,Java,Listview,User Interface,Javafx,我是JavaFX新手,所以这可能是一个微不足道的问题。我在一个对话框中有一个ListView,当用户单击菜单按钮时显示。问题是,当对话框显示时,ListView中的第一项已被选中。我有listView.getSelectionModel().SelectEditeProperty().addListener(new ChangeListener())作为用户选择项目时的侦听器,但由于第一个项目已被选中,因此当我单击第一个项目时,不会发生任何事情。我需要找到一种方法来确保对话框显示时没有选择任何项

我是JavaFX新手,所以这可能是一个微不足道的问题。我在一个对话框中有一个ListView,当用户单击菜单按钮时显示。问题是,当对话框显示时,ListView中的第一项已被选中。我有
listView.getSelectionModel().SelectEditeProperty().addListener(new ChangeListener())
作为用户选择项目时的侦听器,但由于第一个项目已被选中,因此当我单击第一个项目时,不会发生任何事情。我需要找到一种方法来确保对话框显示时没有选择任何项目。在显示对话框之前,我尝试使用
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();
Pane rootPane=new Pane();
ObservableList listChoices=FXCollections.observableArrayList(NewChoices.values());
ListView ListView=新建ListView();
setItems(listChoices);
rootPane.getChildren().add(listView);
Stage newDialog=newstage(StageStyle.UTILITY);
newDialog.initmodula(modula.APPLICATION_modula);
newDialog.setTitle(“新”);
场景newDialogScene=新场景(根窗格);
newDialog.setScene(newDialogScene);
newDialog.show();

应在8u40中修复-请参阅,因为新场景上只有一个列表,没有按钮,当场景获得焦点时,由于唯一可聚焦的节点是列表,因此其第一项被选中

添加一些OK/Cancel按钮可能会有所帮助,因为它们可以获得焦点,但为此,它们需要先获得焦点

这两个选项中的任何一个都有效:

  • 首先放置按钮,使其成为第一个可聚焦节点:

    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新API(JDK 8u40中提供的API分支),这样您就不会有任何问题

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

    Optional<ButtonType> result = dialog.showAndWait();
listView.setItems(listChoices);
最终对话框=新建对话框();
dialog.getDialogPane().setContent(listView);
可选结果=dialog.showAndWait();

您使用什么API来显示对话框?JDK8_40?控制SFX?定制场景?除了对话框上的列表,还有其他控件吗?我想我正在使用JDK8_24。我现在不在电脑旁,所以我记不清确切的一个,但它是JDK82。不,它只是对话框中的列表视图。因为直到8u40才有对话框,所以我认为你所说的对话框只是一个普通的场景。如果那里只有一个列表(没有关闭所谓对话框的按钮?),我的猜测是当场景获得焦点时,因为唯一可聚焦的节点是列表,它的第一项被选中。添加一些确定/取消按钮可能会有所帮助,因为它们可以获得焦点。也许你可以添加一个对话框。这个对话框只是一个普通的舞台和场景,但它在右上角只有一个退出按钮,它会阻止程序其余部分的输入。我将尝试添加一些OK/Cancel按钮,看看是否有效。如果我仍然有问题,我会在这里发布代码,这样你就可以看到我哪里出了问题。我尝试添加一个按钮,但没有帮助。我现在将发布一些代码。这对我现在没有用。我不需要额外的节点来关闭模态阶段。它已经有一个退出按钮了。理想情况下,我不需要额外的节点。你确定没有其他办法解决这个问题吗?我没有看到那个按钮,你把它放在哪里?我没有把它放在我自己身上,它自动在那里,就像普通舞台上的最大化/最小化按钮一样。正如@wzberger所说,这是一个bug。。。我向你展示了三种不同的解决方法。如果你问我,我不会有一个没有ok/cancel按钮的模式窗口。因此,在底部添加一个以关闭舞台对您来说应该不是问题。