JavaFX8: jak utworzyć listener do wyboru wiersza w Tableview?
Obecnie mam dwa widoki tableviews na jednym ekranie, co powoduje, że oba widoki tableviews mają wiersze, które użytkownik może wybrać.
Teraz chcę, aby tylko jeden wiersz był zaznaczony w tym samym czasie(nie ma znaczenia, z którego widoku TableView jest wybrany). Myślałem o jakimś słuchaczu, który usuwa zaznaczenie drugiego rzędu, gdy wiersz jest zaznaczony. To jest moja początkowa konfiguracja:
Krok 1
Wyszukaj sposób wiązania metody z zaznaczeniem wiersza (nie ma czegoś takiego jak tableview.setOnRowSelected(method)
)
Krok 2 Utwórz metodę, która działa jak rodzaj słuchacza: gdy wiersz jest zaznaczony, usuń zaznaczenie drugiego wiersza (wiem, jak zrobić tę część)
Class1 selectedObject1 = (Class1)tableview1.getSelectionModel().getSelectedItem();
Class2 selectedObject2 = (Class2)tableview2.getSelectionModel().getSelectedItem();
if(selectedObject1 != null && selectedObject2 != null) {
tableview1.getSelectionModel().clearSelection();
}
Więc pierwszym krokiem jest problem. Myślałem o liście obserwowalnej, na której można utworzyć słuchacza, a następnie dodać wybrany wiersz do listy. Gdy tak się stanie, słuchacz może wywołać metodę.
Ktoś wie, jak to zrobić?
Każda pomoc jest bardzo mile widziana. 5 answers
selectedItem
w modelu selekcji jest obserwowalną właściwością, więc powinieneś być w stanie to osiągnąć za pomocą:
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();
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 14:11:52
Moim rozwiązaniem byłoby stworzenie 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();
...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 13:14:28
Używam go do usuwania wybranego wiersza.
public void ButtonClicked()
{
ObservableList<Names> row , allRows;
allRows = table.getItems();
row = table.getSelectionModel().getSelectedItems();
row.forEach(allRows::remove);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-16 00:10:28
To pytanie mi pomogło, 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;
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-29 06:43:59
Jeśli potrzebujesz nie tylko wiersza, ale X|Y pozycji komórki tabeli, wykonaj następujące czynności:
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 "klasycznego" TableView
z List<String>
jako modelem kolumnowym. I oczywiście to label
jest tylko przykładem z mojego kodu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 11:22:06