javafx - make ListView not selectable via mouse

前端 未结 7 2148
执念已碎
执念已碎 2020-12-20 16:33

Is there an option in JavaFX to deactivate the possibility to select the items in a ListView via mouse?

I\'d like to just display a ListView

相关标签:
7条回答
  • 2020-12-20 16:52

    You may block your list view mouse click buy using event handler

    listview.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
    
                @Override
                public void handle(MouseEvent event) {
                    System.out.println(">> Mouse Clicked");
                    event.consume();
                }
            });
    
    0 讨论(0)
  • 2020-12-20 16:57
    @Override
    protected void updateItem(T item, boolean empty) {
        super.updateItem(item, empty);
        updateSelected(false);
    }
    

    Every time you click on a cell, the cell's updateItem will call, so you can deselect it at here. If you check the base class Cell.java. It use this method to prevent empty cell being selected.

    protected void updateItem(T item, boolean empty) {
        setItem(item);
        setEmpty(empty);
        if (empty && isSelected()) {
            updateSelected(false);
        }
    }
    
    0 讨论(0)
  • 2020-12-20 17:00

    Maybe this Pointe you to the right direction? restrict focus1

    If not maybe setting a custom FocusModel could help?

    0 讨论(0)
  • 2020-12-20 17:00

    Try in the code:

    list.setFocusTraversable( false );
    

    and in CSS

    .list-cell:odd, .list-cell:even
    {
        -fx-background-color: white;
        -fx-text-fill: black;
    }
    
    0 讨论(0)
  • 2020-12-20 17:03

    Mordechai's approach works really great.
    I tried to comment with another addition for JFoenix JFXListView but the code formatting wasn't good so I created this answer:

    If you are using JFoenix and the JFXListView you have also the behaviour that you can still see the JFXRippler on cell selection.
    To prevent this or change the rippler override the cell factory:

    //Replace T with your specific type.
    listView.setCellFactory(param -> new JFXListCell<T>() {
    
        @Override
        protected void updateItem(T item, boolean empty) {
            super.updateItem(item, empty);
            cellRippler = new JFXRippler(); //create empty rippler
        }
    });
    
    0 讨论(0)
  • 2020-12-20 17:08

    Setting the list to mouse transparent will also prevent cells with interactable custom list cells from accepting focus.

    The ideal solution is to use a special selection model:

    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.scene.control.MultipleSelectionModel;
    
    public class NoSelectionModel<T> extends MultipleSelectionModel<T> {
    
        @Override
        public ObservableList<Integer> getSelectedIndices() {
            return FXCollections.emptyObservableList();
        }
    
        @Override
        public ObservableList<T> getSelectedItems() {
            return FXCollections.emptyObservableList();
        }
    
        @Override
        public void selectIndices(int index, int... indices) {
        }
    
        @Override
        public void selectAll() {
        }
    
        @Override
        public void selectFirst() {
        }
    
        @Override
        public void selectLast() {
        }
    
        @Override
        public void clearAndSelect(int index) {
        }
    
        @Override
        public void select(int index) {
        }
    
        @Override
        public void select(T obj) {
        }
    
        @Override
        public void clearSelection(int index) {
        }
    
        @Override
        public void clearSelection() {
        }
    
        @Override
        public boolean isSelected(int index) {
            return false;
        }
    
        @Override
        public boolean isEmpty() {
            return true;
        }
    
        @Override
        public void selectPrevious() {
        }
    
        @Override
        public void selectNext() {
        }
    }
    

    Then set the model in the list view:

    listView.setSelectionModel(new NoSelectionModel<MyType>());
    
    0 讨论(0)
提交回复
热议问题