web-dev-qa-db-ja.com

javafx、TableView:セルのダブルクリックを検出する

TableViewを指定すると、セルのダブルクリックを検出する必要があります。

tableView.setOnMouseClicked(new EventHandler<MouseEvent>()
{
    @Override
    public void handle(MouseEvent event)
    {
        if(event.getClickCount()>1)
        {
            System.out.println("double clicked!");
        }
    }
});

マウスがクリックされたセルを特定する方法は?

18
AgostinoX

コード例。
official tableview tutorial「例12-11:セル編集の代替ソリューション」を実行します。
以下を置き換えます:

table.setEditable(false);
Callback<TableColumn, TableCell> cellFactory =
        new Callback<TableColumn, TableCell>() {
            public TableCell call(TableColumn p) {
                TableCell cell = new TableCell<Person, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        setText(empty ? null : getString());
                        setGraphic(null);
                    }

                    private String getString() {
                        return getItem() == null ? "" : getItem().toString();
                    }
                };

                cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        if (event.getClickCount() > 1) {
                            System.out.println("double clicked!");
                            TableCell c = (TableCell) event.getSource();
                            System.out.println("Cell text: " + c.getText());
                        }
                    }
                });
                return cell;
            }
        };

セルは編集できないため、EditingCellする必要はありません。セルファクトリは、セルのレンダリングに使用されます。したがって、セルのsetGraphics()メソッドを使用して、デフォルトのLabeled以外のノード/コントロールを配置できます。 IMOではデフォルトのセルに直接アクセスできないため、イベントフィルターをセルに配置できるように独自のセルファクトリを定義する必要があります。

30
Uluk Biy

JavaFXを使用すると、セルごとに複数のリスナーを設定できます(これが良いことでも悪いことでもありません)。特定の列/行の特定のリスナーへの応答を実行するように設定されたコードがある場合、各リスナーはコードを実行します。セルのマウスクリックをキャプチャするには、以下を使用します。

_table.setEditable(true);
table.getSelectionModel().setCellSelectionEnabled(true);  // selects cell only, not the whole row
table.setOnMouseClicked(new EventHandler<MouseEvent>() {
 @Override
 public void handle(MouseEvent click) {
  if (click.getClickCount() == 2) {
   @SuppressWarnings("rawtypes")
   TablePosition pos = table.getSelectionModel().getSelectedCells().get(0);
   int row = pos.getRow();
   int col = pos.getColumn();
   @SuppressWarnings("rawtypes")
   TableColumn column = pos.getTableColumn();
   String val = column.getCellData(row).toString(); System.out.println("Selected Value, " + val + ", Column: " + col + ", Row: " + row);
   if ( col == 2 ) { ... do something ... } 
   if ( col == 5 ) { ... do something ... } 
   if ( col == 6 ) { ... do something ... } 
   if ( col == 8 ) { ... do something ... } 
  }
 }
});
_

上記のコードからわかるように、マウスクリックに基づいて何かを実行したい列には、次のコードがあります。

if ( col == <int> ) { ... do something ... }

また、これらの列を編集できないように設定しています。

thisCol.setEditable(false);

編集したい行には.setEditable(true)がありますが、マウスクリックによる応答が含まれていません。

セル編集のデフォルトは、2回のマウスクリックです。上記のコードを変更して、セル上のさまざまなマウスイベントをキャプチャできるため、2回のマウスクリックでセルを編集したり、ユーザーが決定した他のマウスイベントでURL、ダイアログボックスなどを開いたりできます。 TableViewを使用すると、想像力とプログラミングスキルに基づいて独自の機能を決定できます。 「編集することも、マウスイベントを発生させることもできます」ということに悩まされることはありません。あなたは両方を行うことができます:)

5
VikingGlen

次のコードをリスナーの本文に追加します。Tはテーブルレコードのタイプです。

  @SuppressWarnings("rawtypes")
  ObservableList<TablePosition> cells = tableView.getSelectionModel().getSelectedCells();
  for( TablePosition< T, ? > cell : cells )
  {
     System.out.println( cell.getColumn());
  }// for
2
Aubin

私の場合、次のコードを使用します

tableViewObject.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent t) {
                if (t.getClickCount() == 2 && getSelectedItem() != null) {
                    SMPBLogger.logInfo("Double cliked", Boolean.TRUE);
                    if (listener != null) {
                        listener.doubleClicked(tableViewObject.this,getSelectedItem());
                    }
                }
            }
        });
1
Dmitry Nelepov

セルファクトリを使用してセルを作成し、セルノードを作成するセルファクトリで、tableViewではなくノードにマウスイベントハンドラーまたはフィルターを配置します。

1
jewelsea