Первая строка всегда выбирается при фокусировке TableView или TreeView в приложении JavaFX
Я понял, что все tableViews и treeViews в моем приложении JavaFX выбирают первую строку, как только они фокусируются. В результате, даже когда я нажимаю на соответствующую полосу прокрутки, будет выбран первый ряд. Поскольку я, конечно, не хочу иметь такое поведение, я хотел бы спросить, есть ли способ избежать этого поведения?
РЕДАКТИРОВАТЬ: я добавил простой пример, который создает два скромных списка. Здесь, как только вы нажимаете на пустую строку, выбирается первая строка.
РЕДАКТИРОВАТЬ 2: Добавил два маленьких слушателя к коду, так что проблема повторяется без перезапуска приложения.
package testlistview;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class TestListView extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
HBox root = new HBox();
root.setSpacing(10);
Scene primaryStageScene = new Scene(root);
primaryStage.setScene(primaryStageScene);
ListView<String> l1 = new ListView();
l1.getItems().addAll("a", "b", "c", "d", "e", "f", "g");
ListView<String> l2 = new ListView();
l2.getItems().addAll("1", "2", "3", "4", "5", "6", "7");
root.getChildren().addAll(l1, l2);
l1.setOnMouseClicked((MouseEvent e) -> {
l2.getSelectionModel().clearSelection();
});
l2.setOnMouseClicked((MouseEvent e) -> {
l1.getSelectionModel().clearSelection();
});
primaryStage.show();
}
}
РЕДАКТИРОВАТЬ 3: Я понял, что первый ряд также выбирается, когда я сортирую таблицу. Однако, чтобы избежать этого, я создал небольшой хак (что, вероятно, очень плохой стиль, но пока работает).
private boolean sorted = false;
// (...)
tableView.addEventFilter(MouseEvent.MOUSE_PRESSED,
new EventHandler<MouseEvent>() {
public void handle(MouseEvent e) {
if (!tableView.isFocused()) {
if (e.getPickResult().getIntersectedNode() instanceof Label) {
sorted = true;
}
}
}
;
});
tableView.focusedProperty().addListener((a,b,c) -> {
if(!tableView.isPressed() || sorted) {
tableView.getSelectionModel().clearSelection();
sorted = false;
}
});
Поэтому здесь eventFilter активируется перед слушателем. Насколько я вижу, только заголовок является экземпляром Label. В результате при каждом первом щелчке по заголовку выбор очищается.
Однако, как обсуждалось в посте ниже, я думаю, ошибка исчезнет со следующим выпуском Java.