2014-10-06 71 views
3

我有一個SelectionMode.MULTIPLE實現代碼如下:如何在JavaFX tableview中取消選擇行?

table.setEditable(true); 
    table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

    table.getSelectionModel().selectedItemProperty().addListener(
      (observable, oldValue, newValue) -> { 
       table.getSelectionModel().getSelectedItems().forEach(System.out::println); 
      }); 

選擇行工作FINDE,但如果取消再行(通過按Ctrl +左鍵點擊)聽者不會立即作出反應了這一點。我必須做的,取消一排如下:

  1. 選擇讓說「搶」,「彼得」,「最大」和「約翰」(通過使用Ctrl individualy選擇它們+左按shift +左鍵點擊)
  2. 取消選擇單擊或全部一起「彼得」通過按Ctrl +左鍵點擊(現在這行有一個奇怪的藍色邊框,並沒有檢測到聽者的變化)
  3. 取消選擇另一行(現在這個行有這個奇怪的邊框,'Peter'是行看起來很正常的)
  4. 重新選擇前面的小號行(現在的偵聽器檢測到,我不勾選「彼得」
    enter image description here
+0

我紛紛轉載我的系統上也是如此。這是一個錯誤。請在此登錄:https://javafx-jira.kenai.com。 如果你想讓我爲你登錄,只需告訴我。 – Boomah 2014-10-06 08:56:50

+0

我不認爲這是一個錯誤。給我時間做一些測試,我會檢查,但通常對於多重選擇,您應該向所選項目的**列表**而不是單個選定項目(這是最後一個選定項目)註冊一個監聽器。 – 2014-10-06 10:43:27

+0

@James_D是對的。我必須將列表添加到整個列表中。下面的代碼可以工作,所以如果jamed_d想要,他可以將其作爲答案發布。 ().getSelectedModel()。getSelectedItems()。addListener((ListChangeListener.Change <?extends Person> c) - > { } table.getSelectionModel()。getSelectedItems()。forEach(System。::出來的println); }); 我不知道有一種方法'getSelectedItem ** s **',但奇怪的是沒有任何屬性,就像單個項目'selectedItemProperty'一樣。 – haisi 2014-10-06 10:58:48

回答

3

按照javadocs多種選擇模式selectedItem屬性是指選擇的最後一項:

的當選擇 模型設置爲單選,但在 多選模式下同樣適用時,選擇的項目屬性最爲常用。在此模式下,所選項目 始終代表所做的最後選擇。

在您的情況,如果你選擇「搶」,「彼得」,「最大」和「約翰」,按照這個順序,那麼選擇的項目最終的選擇(「約翰」)的最後一個人,並且所選項目列表包含全部四個項目。當你取消選擇「彼得」時,最後選擇的項目仍然是「約翰」。由於selectedItem尚未更改,因此不會調用您的更改偵聽器。當您取消選擇另一個項目然後重新選擇它時,最後選擇的項目將更改爲該項目,並且調用您的偵聽器。

您看到的「怪異」邊框只是表格中顯示的焦點(您只需點擊它)的單元格,該單元格未被選中。

要查看所有更改選定的項目,你需要選擇的項目的列表註冊一個ListChangeListener

table.getSelectionModel().getSelectedItems().addListener((Change<? extends Person> change) -> 
    System.out.println(table.getSelectionModel().getSelectedItems());