20

TableViewが与えられた場合、セルのダブルクリックを検出する必要があります。

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

マウスがクリックされたセルを特定するにはどうすればよいですか?

4

5 に答える 5

32

コード例。公式テーブルビューチュートリアル「例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セルは編集できないため、必要ありません。セルファクトリは、セルのレンダリングに使用されます。Labeledしたがって、セルのsetGraphics()メソッドを使用して、デフォルト以外の任意のノード/コントロールを配置できます。IMOではデフォルトのセルに直接アクセスできないため、セルにイベントフィルターを配置できるように独自のセルファクトリを定義する必要があります。

于 2012-09-25T21:36:35.243 に答える
9

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を使用すると、想像力とプログラミングスキルに基づいて独自の機能を決定できます。あなたは「私はそれを編集するか、それを使ってマウスイベントを発生させることができる」ということに固執していません。あなたは両方を行うことができます:)

于 2015-09-07T15:59:53.657 に答える
4

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

  @SuppressWarnings("rawtypes")
  ObservableList<TablePosition> cells = tableView.getSelectionModel().getSelectedCells();
  for( TablePosition< T, ? > cell : cells )
  {
     System.out.println( cell.getColumn());
  }// for
于 2012-09-26T03:52:12.407 に答える
2

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

于 2012-09-19T17:10:36.413 に答える
2

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

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());
                    }
                }
            }
        });
于 2013-09-03T10:17:58.447 に答える