2014-10-17 28 views
18

我現在有一個畫面,這導致兩個TableViews 2個tableviews都行,用戶可以選擇。JavaFX8:如何在Tableview中爲選擇行創建監聽器?

現在我想只有一行在同一時間選擇(並不重要的TableView它選自)。我正在考慮某種監聽器,當選中某行時,會取消選擇另一行。這是我的初始設置:

步驟1 搜索綁定到行的選擇方法的方式(沒有像tableview.setOnRowSelected(method)

步驟2 創建方法,就像一種監聽:當選擇一排,取消選擇其他行(我知道如何做到這一點的一部分)

Class1 selectedObject1 = (Class1)tableview1.getSelectionModel().getSelectedItem(); 
Class2 selectedObject2 = (Class2)tableview2.getSelectionModel().getSelectedItem(); 

if(selectedObject1 != null && selectedObject2 != null) { 
    tableview1.getSelectionModel().clearSelection(); 
} 

因此,第一步就是問題所在。我正在考慮一個可以創建偵聽器的可觀察列表,然後將所選行添加到列表中。發生這種情況時,監聽者可以調用該方法。 任何任何線索如何做到這一點?

任何幫助,非常感謝。

回答

41

選擇模型中的selectedItem是可觀察到的財產,所以你應該能夠實現這一點:

tableview1.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> { 
    if (newSelection != null) { 
     tableview2.getSelectionModel().clearSelection(); 
    } 
}); 

tableview2.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> { 
    if (newSelection != null) { 
     tableview1.getSelectionModel().clearSelection(); 
    } 
}); 
+1

完美的作品,謝謝!對於其他想要使用它的人:只需將此代碼放入代碼的初始化部分即可。就我而言,這是一個FXML文件的控制器。 – bashoogzaad 2014-10-19 12:23:12

0

我的解決方案會爲表中創建自定義的電池工廠,並將其設置爲每個表列。

Callback<TableColumn<..., ...>, TableCell<..., ...>> value = param -> { 
       TextFieldTableCell cell = new TextFieldTableCell<>(); 
       cell.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> { 
          //your code 
         } 
       ); 
       return cell; 
      }; 
      packageName.setCellFactory(value); 

    table1.column1.setCellFactory(); 
    table2.column1.setCellFactory(); 
    ... 
+0

謝謝您的回答!我發現你的解決方案可行,但@James_D提供了我更喜歡的答案,因爲它實現起來要簡單得多。 – bashoogzaad 2014-10-19 12:24:37

+0

這只是MOUSE_CLICKED事件。這不是捕捉鍵盤事件... – andrej 2016-10-25 08:55:30

0

我用它來刪除所選的行。

public void ButtonClicked() 
{ 
    ObservableList<Names> row , allRows; 
    allRows = table.getItems(); 
    row = table.getSelectionModel().getSelectedItems();   
    row.forEach(allRows::remove); 
} 
0

這個問題幫助了我,但在javafx和jfoenix的實驗中,這也適用於我。

deleteSingle.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> { 

      StringProperty selectedItem = table.getSelectionModel().getSelectedItem().getValue().link1; 

      System.out.println("That is selected item : "+selectedItem); 

      if (selectedItem.equals(null)) { 

      System.out.println(" No item selected"); 


      } else { 
       System.out.println("Index to be deleted:" + selectedItem.getValue()); 

       //Here was my database data retrieving and selectd 
       // item deleted and then table refresh 
       table.refresh(); 

       return; 
      } 

     }); 
-1

如果你需要的不僅是該行,但X | y位置的表格單元格的,這樣做:

table.getFocusModel().focusedCellProperty().addListener(
     new ChangeListener<TablePosition>() { 
    @Override 
    public void changed(ObservableValue<? extends TablePosition> observable, 
      TablePosition oldPos, TablePosition pos) { 
     int row = pos.getRow(); 
     int column = pos.getColumn(); 
     String selectedValue = ""; 

     if (table.getItems().size() > row 
       && table.getItems().get(row).size() > column) { 
      selectedValue = table.getItems().get(row).get(column); 
     } 

     label.setText(selectedValue); 
    } 
}); 

在這個例子中,我使用的是「經典」 TableViewList<String>作爲列模型。當然,那label只是我的代碼中的一個例子。

+0

這將如何幫助實現OP的要求(取消選擇其他表選擇)?顯然沒有;) – kleopatra 2017-08-28 12:06:38