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
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();
}
});
@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);
}
}
Maybe this Pointe you to the right direction? restrict focus1
If not maybe setting a custom FocusModel could help?
Try in the code:
list.setFocusTraversable( false );
and in CSS
.list-cell:odd, .list-cell:even
{
-fx-background-color: white;
-fx-text-fill: black;
}
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
}
});
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>());