import java.util.List; 
import java.util.stream.Collectors; 
import java.util.stream.IntStream; 

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.event.EventHandler; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.CheckBox; 
import javafx.scene.control.ListView; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class ListViewApplication extends Application { 

private final EventHandler<MouseEvent> mouseEventHandler = System.out::println; 
private final ChangeListener<String> selectionChangedListener = (p, o, n) -> System.out 
.format("selection changed from %s to %s%n", o, n); 

@Override 
public void start(Stage primaryStage) throws Exception { 
// dummy data 
List<String> items = IntStream.range(0, 10) 
.mapToObj(i -> String.format("item #%d", i)) 
.collect(Collectors.toList()); 

ListView<String> listView = new ListView<>(); 
listView.setId("list"); 
listView.getItems().addAll(items); 
listView.getSelectionModel().selectedItemProperty().addListener(selectionChangedListener); 

CheckBox enableEventLoggingCheckbox = new CheckBox("Log mouse events"); 

BorderPane root = new BorderPane(); 
root.setCenter(listView); 
root.setBottom(enableEventLoggingCheckbox); 
root.setStyle("-fx-font-size:24pt"); 

enableEventLoggingCheckbox.selectedProperty().addListener((p, o, n) -> { 
if (n) { 
addEventFilters(listView); 
} else { 
removeEventFilters(listView); 
} 
}); 

Scene scene = new Scene(root, 600, 600); 

primaryStage.setScene(scene); 
primaryStage.show(); 
} 

private void addEventFilters(Node node) { 
node.addEventFilter(MouseEvent.MOUSE_PRESSED, mouseEventHandler); 
node.addEventFilter(MouseEvent.MOUSE_DRAGGED, mouseEventHandler); 
node.addEventFilter(MouseEvent.DRAG_DETECTED, mouseEventHandler); 
node.addEventFilter(MouseEvent.MOUSE_RELEASED, mouseEventHandler); 
} 

private void removeEventFilters(Node node) { 
node.removeEventFilter(MouseEvent.MOUSE_PRESSED, mouseEventHandler); 
node.removeEventFilter(MouseEvent.MOUSE_DRAGGED, mouseEventHandler); 
node.removeEventFilter(MouseEvent.DRAG_DETECTED, mouseEventHandler); 
node.removeEventFilter(MouseEvent.MOUSE_RELEASED, mouseEventHandler); 
} 

public static void main(String[] args) { 
Application.launch(args); 
} 
} 