web-dev-qa-db-ja.com

JavaFX8:Tableviewで行を選択するためのリスナーを作成する方法

現在、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が問題です。私はリスナーを作成できる監視可能なリストを考えていて、選択した行をリストに追加しました。これが発生すると、リスナーはメソッドを呼び出すことができます。誰でもこれを作る方法の手がかりはありますか?

どんな助けも大歓迎です。

24
bashoogzaad

選択モデルの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();
    }
});
55
James_D

選択した行を削除するために使用します。

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

        });
1
badarshahzad

私の解決策は、テーブルのカスタムセルファクトリを作成し、テーブルの各列に設定することです。

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();
    ...
1
user2186425

行だけでなく、テーブルセルの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は私のコードの単なる例です。

0