ListView,通过双击选择项目

ListView,通过双击选择项目,listview,javafx-8,Listview,Javafx 8,我有一个主窗口,用户可以通过单击ListView项来选择程序功能。然而,即使他完全在项目(白色箭头)之外单击,程序仍会启动“数字生成器”功能。我不喜欢那样 public class MainRootController2 extends Controller implements Initializable { @FXML StackPane stackPane; @FXML ListView<String> listView; privat

我有一个主窗口,用户可以通过单击ListView项来选择程序功能。然而,即使他完全在项目(白色箭头)之外单击,程序仍会启动“数字生成器”功能。我不喜欢那样

public class MainRootController2 extends Controller implements Initializable {

    @FXML
    StackPane stackPane;
    @FXML
    ListView<String> listView;
    private ObservableList<String> list;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        //making a list and setting a background
        list = FXCollections.observableArrayList("Number Generator", "Cards");
        listView.setBackground(new Background(new BackgroundImage(new Image("MainRootBackground.jpg"),
                BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
                BackgroundPosition.CENTER, BackgroundSize.DEFAULT)));
        listView.setItems(list);
        listView.getSelectionModel().clearSelection();
    }

    @Override
    public Pane getMainPane() {
        return stackPane;
    }

    /************************ EVENTS *************************/
    @FXML
    private void listViewMouseDoubleClicked(MouseEvent e){
        if(e.getClickCount() > 1){
            String s = listView.getSelectionModel().getSelectedItem();

            switch(s){
                case "Number Generator":
                    ChangeTheRoot change = new ChangeTheRoot();
                    if( change.initialize(Main.primaryStage, true, Main.NUMBER_GENERATOR_ROOT, "Number Generator", true, new NumberGeneratorController()) == false)
                        Dialogs.create().title("Error").masthead(null).message("Couldn't load the components!").showInformation();

                    change.doFadingTransition(stackPane, Main.fadeOutMillis, Main.fadeInMillis, true);
                    break;

                default:
                    break;
            }
        }
    }

}

public类MainRootController2扩展控制器实现可初始化{
@FXML
堆叠窗格堆叠窗格;
@FXML
列表视图列表视图;
私人观察者名单;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
//制作列表并设置背景
列表=FXCollections.observableArrayList(“数字生成器”、“卡片”);
setBackground(新背景)(新背景图像)(新图像(“MainRootBackground.jpg”),
背景重复,不重复,背景重复,不重复,
BackgroundPosition.CENTER、BackgroundSize.DEFAULT));
setItems(列表);
listView.getSelectionModel().clearSelection();
}
@凌驾
公共窗格getMainPane(){
返回堆栈窗格;
}
/************************事件*************************/
@FXML
私有无效列表视图鼠标双击(鼠标事件e){
如果(如getClickCount()>1){
字符串s=listView.getSelectionModel().getSelectedItem();
开关{
案例“数字生成器”:
changetroot change=新的changetroot();
if(change.initialize(Main.primaryStage,true,Main.NUMBER\u GENERATOR\u ROOT,“NUMBER GENERATOR”,true,new NumberGeneratorController())==false)
Dialogs.create().title(“Error”).maisthead(null).消息(“无法加载组件!”).showInformation();
change.doFadingTransition(stackPane,Main.fadeOutMillis,Main.fadeInMillis,true);
打破
违约:
打破
}
}
}
}
编辑。。。。固定版本:

public class MainRootController2 extends Controller implements Initializable {

    @FXML
    StackPane stackPane;
    @FXML
    ListView<String> listView;
    private ObservableList<String> list;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        //making a list and setting a background
        list = FXCollections.observableArrayList("Number Generator", "Cards");

        listView.setBackground(new Background(new BackgroundImage(new Image("MainRootBackground.jpg"),
                BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
                BackgroundPosition.CENTER, BackgroundSize.DEFAULT)));
        listView.setItems(list);
        listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
                                    @Override 
                                    public ListCell<String> call(ListView<String> list) {
                                        return new MouseClickListCell();
                                    }

        });
        listView.getSelectionModel().clearSelection();
    }

    @Override
    public Pane getMainPane() {
        return stackPane;
    }

    /************************ EVENTS *************************/
    private void fireUpTheFeature(String name){
        String s = listView.getSelectionModel().getSelectedItem();

        switch(s){
            case "Number Generator":
                ChangeTheRoot change = new ChangeTheRoot();
                if( change.initialize(Main.primaryStage, true, Main.NUMBER_GENERATOR_ROOT, "Number Generator", true, new NumberGeneratorController()) == false)
                    Dialogs.create().title("Error").masthead(null).message("Couldn't load the components!").showInformation();

                change.doFadingTransition(stackPane, Main.fadeOutMillis, Main.fadeInMillis, true);
                break;
            case "Cards":
                break;
            default:
                break;
        }

    }

    public class MouseClickListCell extends ListCell<String>
    {
        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);

            if(empty) {
                setText(null);
                setOnMouseClicked(null);
            }
            else {
                setText(item.toString());
                setOnMouseClicked(new EventHandler<MouseEvent>() {

                    @Override
                    public void handle(MouseEvent event) {
                        if(event.getClickCount() > 1){
                            fireUpTheFeature(getItem());
                        }
                    }
                });
            }
        }
    }
}
public类MainRootController2扩展控制器实现可初始化{
@FXML
堆叠窗格堆叠窗格;
@FXML
列表视图列表视图;
私人观察者名单;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
//制作列表并设置背景
列表=FXCollections.observableArrayList(“数字生成器”、“卡片”);
setBackground(新背景)(新背景图像)(新图像(“MainRootBackground.jpg”),
背景重复,不重复,背景重复,不重复,
BackgroundPosition.CENTER、BackgroundSize.DEFAULT));
setItems(列表);
setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView列表){
返回新的MouseClickListCell();
}
});
listView.getSelectionModel().clearSelection();
}
@凌驾
公共窗格getMainPane(){
返回堆栈窗格;
}
/************************事件*************************/
私有void fireUpTheFeature(字符串名称){
字符串s=listView.getSelectionModel().getSelectedItem();
开关{
案例“数字生成器”:
changetroot change=新的changetroot();
if(change.initialize(Main.primaryStage,true,Main.NUMBER\u GENERATOR\u ROOT,“NUMBER GENERATOR”,true,new NumberGeneratorController())==false)
Dialogs.create().title(“Error”).maisthead(null).消息(“无法加载组件!”).showInformation();
change.doFadingTransition(stackPane,Main.fadeOutMillis,Main.fadeInMillis,true);
打破
案例“卡片”:
打破
违约:
打破
}
}
公共类MouseClickListCell扩展ListCell
{
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
setOnMouseClicked(空);
}
否则{
setText(item.toString());
setOnMouseClicked(新事件处理程序(){
@凌驾
公共无效句柄(MouseeEvent事件){
如果(event.getClickCount()>1){
fireUpTheFeature(getItem());
}
}
});
}
}
}
}

我没有看到您的FXML文件,但从您的命名我可以猜到,每当您的
列表视图被单击时,您的控制器方法
就会被激发

每当用户单击
列表视图
区域中的任何位置时,就会触发此事件。您需要的是删除鼠标单击的
处理程序,并将该代码移动到
列表单元格
呈现程序中

如果仅将鼠标侦听器附加到非空单元格,则仅当单击
ListCell
时才会触发代码

例如:

public static class MouseClickListCell<T> extends ListCell<T>
{
    @Override
    protected void updateItem(T item, boolean empty) {
        super.updateItem(item, empty);

        if(empty) {
            setText(null);
            setOnMouseClicked(null);
        }
        else {
            setText(item.toString());
            setOnMouseClicked(ev -> doMagic());
        }
    }
}
公共静态类MouseClickListCell扩展ListCell
{
@凌驾
受保护的void updateItem(T项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
setOnMouseClicked(空);
}
否则{
setText(item.toString());
setOnMouseClicked(ev->doMagic());
}
}
}

设置鼠标点击(ev->doMagic())但是我怎么知道哪个单元格被点击了???你读过JavaDocs吗?在您的
ListCell
中,您可以执行
getItem()
来获取单元格的当前项……对于这样一个小功能,有很多更改。我做了一些改变,效果很好!谢谢(我还把整个固定鳕鱼