2014-10-17 12 views
18

Tôi hiện có hai bảng xem trước trong một màn hình, kết quả trong cả hai TableViews đều có các hàng mà người dùng có thể chọn.JavaFX8: Cách tạo trình nghe để chọn hàng trong Tableview?

Bây giờ, tôi chỉ muốn một hàng được chọn cùng một lúc (bất kể bạn chọn TableView nào). Tôi đã suy nghĩ về một số loại người nghe mà bỏ chọn hàng khác khi một hàng được chọn. Đây là thiết lập ban đầu của tôi:

Bước 1 Tìm kiếm một cách để ràng buộc một phương pháp để việc lựa chọn một hàng (không có cái gì đó như tableview.setOnRowSelected(method))

Bước 2 Tạo phương pháp mà hoạt động như một loại người nghe: khi một hàng được chọn, bỏ chọn hàng khác (tôi biết cách thực hiện phần này)

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

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

Vì vậy, bước một là vấn đề. Tôi đã suy nghĩ về một danh sách quan sát mà trên đó một người nghe có thể được tạo ra, và sau đó thêm hàng đã chọn vào danh sách. Khi điều này xảy ra, người nghe có thể gọi phương thức. Bất cứ ai cũng có manh mối về cách thực hiện điều này?

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

41

Các selectedItem trong mô hình lựa chọn là một tài sản quan sát được, vì vậy bạn sẽ có thể đạt được điều này với:

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

Hoạt động hoàn hảo, cảm ơn bạn! Đối với những người khác muốn sử dụng điều này: chỉ cần đặt mã này vào phần khởi tạo mã của bạn. Trong trường hợp của tôi, đây là một bộ điều khiển của một tập tin FXML. – bashoogzaad

0

Giải pháp của tôi sẽ tạo nhà máy sản xuất ô tùy chỉnh cho bảng và đặt nó cho từng cột trong bảng.

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

Cảm ơn câu trả lời của bạn! Tôi thấy rằng giải pháp của bạn sẽ hoạt động, nhưng @James_D cung cấp câu trả lời mà tôi thích, bởi vì nó đơn giản hơn nhiều để thực hiện. – bashoogzaad

+0

chỉ là sự kiện MOUSE_CLICKED. Nó không bắt các sự kiện bàn phím ... – andrej

0

tôi sử dụng nó để xóa các hàng lựa chọn.

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

Câu hỏi này đã giúp tôi nhưng trong quá trình thử nghiệm trong javafx và jfoenix điều này cũng phù hợp với tôi.

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

Trong trường hợp bạn không chỉ cần hàng, nhưng x | vị trí y của ô trong bảng, làm như sau:

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

Trong ví dụ này, tôi đang sử dụng một "cổ điển" TableView với List<String> làm mô hình cột. Và, tất nhiên, label chỉ là một ví dụ từ mã của tôi.

+0

làm thế nào điều này sẽ giúp đạt được yêu cầu của OP (bỏ chọn lựa chọn bảng khác)? Rõ ràng là không hề;) – kleopatra

Các vấn đề liên quan