現在、1つの画面に2つのテーブルビューがあり、その結果、両方のテーブルビューにユーザーが選択できる行があります。
これで、同時に選択される行は1つだけになります(どの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();
}
したがって、ステップ1が問題です。私はリスナーを作成できる監視可能なリストを考えていて、選択した行をリストに追加しました。これが発生すると、リスナーはメソッドを呼び出すことができます。誰でもこれを作る方法の手がかりはありますか?
どんな助けも大歓迎です。
選択モデルの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();
}
});
選択した行を削除するために使用します。
public void ButtonClicked()
{
ObservableList<Names> row , allRows;
allRows = table.getItems();
row = table.getSelectionModel().getSelectedItems();
row.forEach(allRows::remove);
}
この質問は私を助けてくれましたが、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;
}
});
私の解決策は、テーブルのカスタムセルファクトリを作成し、テーブルの各列に設定することです。
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();
...
行だけでなく、テーブルセルの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);
}
});
この例では、列モデルとしてList<String>
を持つ「クラシック」TableView
を使用しています。そして、もちろん、そのlabel
は私のコードの単なる例です。