First Row wird beim Fokussieren einer TableView oder TreeView in einer JavaFX-Anwendung immer ausgewählt

Ich habe festgestellt, dass alle tableViews und treeViews in meiner JavaFX-Anwendung die erste Zeile auswählen, sobald sie fokussiert sind. Selbst wenn ich auf eine entsprechende Bildlaufleiste klicke, wird die erste Zeile ausgewählt. Da ich ein solches Verhalten natürlich nicht haben möchte, möchte ich fragen, ob es eine Möglichkeit gibt, dieses Verhalten zu vermeiden?

EDIT: Ich habe ein einfaches Beispiel hinzugefügt, das zwei bescheidene Listen erstellt. Hier wird, sobald auf eine leere Zeile geklickt wird, die erste Zeile ausgewählt.

EDIT 2: Dem Code wurden zwei kleine Listener hinzugefügt, sodass das Problem wiederholt werden kann, ohne die Anwendung neu zu starten.

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: Ich habe festgestellt, dass die erste Zeile auch ausgewählt wird, wenn ich eine Tabelle sortiere. Um dies jedoch zu vermeiden, habe ich einen kleinen Hack erstellt (was wahrscheinlich ein sehr schlechter Stil ist, aber im Moment funktioniert er).

  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;
                }
            });

So wird hier der eventFilter vor dem Listener aktiviert. Soweit ich sehen kann, ist nur der Header von Instanz Label. Jedes Mal, wenn Sie zuerst auf die Überschrift klicken, wird die Auswahl gelöscht.

Jedoch, wie im folgenden Beitrag beschrieben, wird der Fehler mit der nächsten Java-Veröffentlichung verschwinden.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage