2014-10-17 13 views
18

Obecnie mam dwa widoki tabeli na jednym ekranie, co powoduje, że oba Widoki stołów mają wiersze, które użytkownik może wybrać.JavaFX8: Jak utworzyć detektor do wyboru wiersza w Tableview?

Teraz chcę wybrać tylko jeden wiersz w tym samym czasie (nie ma znaczenia, która tabela jest wybrana z). Myślałem o jakimś słuchaczu, który odznacza drugi rząd, gdy wybierany jest wiersz. Jest to moja pierwsza konfiguracja:

Krok 1 Szukaj sposób, aby stała się wiążąca metodę doboru rzędu (nie istnieje coś takiego jak tableview.setOnRowSelected(method))

Krok 2 Utwórz metodę, która działa jak pewnego rodzaju słuchacza: kiedy zostanie wybrany wiersz, wyłącz drugi wiersz (wiem jak to zrobić część)

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

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

Więc krok jeden jest problem. Zastanawiałem się nad możliwą do zaobserwowania listą, na której można utworzyć detektor, a następnie dodać wybrany wiersz do listy. Gdy tak się stanie, słuchacz może wywołać metodę. Czy ktoś ma jakąś wskazówkę, jak to zrobić?

Każda pomoc jest bardzo doceniana.

Odpowiedz

41

selectedItem w modelu selekcji jest własnością obserwowalne, więc powinieneś być w stanie osiągnąć z:

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

Działa doskonale, dziękuję! Dla innych, którzy chcą z tego skorzystać: po prostu umieść ten kod w inicjalizacji części kodu. W moim przypadku jest to kontroler pliku FXML. – bashoogzaad

0

Moim rozwiązaniem byłoby utworzenie niestandardowej fabryki komórek dla tabeli i ustawienie jej dla każdej kolumny tabeli.

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

Dzięki za odpowiedź! Rozumiem, że twoje rozwiązanie będzie działało, ale @James_D dostarczył odpowiedź, którą preferuję, ponieważ jest o wiele prostsza w implementacji. – bashoogzaad

+0

to tylko wydarzenie MOUSE_CLICKED. To nie łapie wydarzeń na klawiaturze ... – andrej

0

Używam go do usunięcia wybranego wiersza.

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

To pytanie pomogło mi, ale podczas eksperymentu w javafx i jfoenix to również działa dla mnie.

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

W przypadku, gdy nie trzeba tylko rząd, ale x | pozycja y w komórce tabeli, to zrobić:

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

W tym przykładzie używam „klasyczny” TableView z List<String> jako model kolumny. I, oczywiście, że label jest tylko przykładem z mojego kodu.

+0

w jaki sposób pomogłoby to osiągnąć wymaganie PO (odznacz inne ustawienie tabeli)? Oczywiście wcale nie;) – kleopatra

Powiązane problemy