。聚焦一個TableView中或TreeView中,我意識到,在我的JavaFX應用程序的所有tableViews和樹視圖都只要他們得到集中選擇第一行。因此,即使我點擊一個對應的滾動條,第一行也會被選中。既然我當然不想有這樣的行爲,我想問一下,是否有辦法避免這種行爲?第一行始終被選中當在JavaFX應用程序
編輯:我添加了一個簡單的例子,外幣2個不起眼的清單。這裏只要點擊一個空行,第一行就會被選中。
編輯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。因此每次首先單擊標題時,選擇都會被清除。
然而,如下面的討論後,我想,這個bug會在下一版本的Java消失。
謝謝您的回答,恕不另行通知)項變更。但是,這種方法的問題在於,當我明確點擊一行時,偵聽器也會被觸發。在這種情況下,應該選擇該行。對不起,沒有正確指出這一點。那麼當我明確點擊一個非空行時,是否還有一種方法可以避免偵聽器觸發? – Duke134
表格在第一次鼠標單擊時從不選擇一行。第一次鼠標點擊被保留爲焦點。從第二次點擊開始,表格將聽取行選擇。 – ItachiUchiha
感謝您對我的問題如此感興趣。不過,我在第一篇文章中添加了一段代碼片段。所以當你啓動這個代碼並點擊一個空行時,第一行總是在應用程序中被選中,這對我來說是一個不直觀的行爲。 – Duke134