A primeira linha sempre é selecionada ao focalizar um TableView ou TreeView em um aplicativo JavaFX
Percebi que todos os tableViews e treeViews no meu aplicativo JavaFX estão selecionando a primeira linha assim que focados. Como resultado, mesmo quando clico na barra de rolagem correspondente, a primeira linha será selecionada. Como é claro que eu não quero ter esse comportamento, gostaria de perguntar se existe uma maneira de evitar esse comportamento.
EDIT: Adicionei um exemplo simples que cria duas listas humildes. Aqui, assim que alguém clica em uma linha vazia, a primeira linha é selecionada.
EDIT 2: Adicionado dois pequenos ouvintes ao código, para que o problema seja repetível sem reiniciar o aplicativo.
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();
}
}
EDIT 3: Percebi que a primeira linha também é selecionada quando estou classificando uma tabela. No entanto, para evitar isso, criei um pequeno truque (que provavelmente é um estilo muito ruim, mas funciona por enquanto).
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;
}
});
Portanto, aqui o eventFilter é ativado antes do ouvinte. Tanto quanto posso ver, apenas o cabeçalho é da instância Label. Como resultado, cada vez que o cabeçalho é clicado primeiro, a seleção é limpa.
No entanto, como discutido no post abaixo, eu acho, o bug desaparecerá com o próximo lançamento do java.