2012-07-05 41 views

Respuesta

0

No estoy seguro, pero supongo que javafx.scene.input.Clipboard puede ayudarlo aquí.

9
tableView.getSelectionModel().setCellSelectionEnabled(true); 
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

MenuItem item = new MenuItem("Copy"); 
item.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent event) { 
     ObservableList<TablePosition> posList = tableView.getSelectionModel().getSelectedCells(); 
     int old_r = -1; 
     StringBuilder clipboardString = new StringBuilder(); 
     for (TablePosition p : posList) { 
      int r = p.getRow(); 
      int c = p.getColumn(); 
      Object cell = tableView.getColumns().get(c).getCellData(r); 
      if (cell == null) 
       cell = ""; 
      if (old_r == r) 
       clipboardString.append('\t'); 
      else if (old_r != -1) 
       clipboardString.append('\n'); 
      clipboardString.append(cell); 
      old_r = r; 
     } 
     final ClipboardContent content = new ClipboardContent(); 
     content.putString(clipboardString.toString()); 
     Clipboard.getSystemClipboard().setContent(content); 
    } 
}); 
ContextMenu menu = new ContextMenu(); 
menu.getItems().add(item); 
tableView.setContextMenu(menu); 
3

no podía aplicar respuesta de Yelliver, no compila para mí, pero he encontrado otra manera muy clara para extraer al portapapeles múltiples datos seleccionados del TableView, que va de la siguiente

TableView tableView = new TableView(); 
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
MenuItem item = new MenuItem("Copy"); 
    item.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 

      ObservableList rowList = (ObservableList) tableView.getSelectionModel().getSelectedItems(); 

      StringBuilder clipboardString = new StringBuilder(); 

      for (Iterator it = rowList.iterator(); it.hasNext();) { 
       ObservableList<Object> row = (ObservableList<Object>) it.next(); 

       for (Object cell : row) { 
        if (cell == null) { 
         cell = ""; 
        } 
        clipboardString.append(cell); 
        clipboardString.append('\t'); 
       } 
       clipboardString.append('\n'); 

      } 
      final ClipboardContent content = new ClipboardContent(); 

      content.putString(clipboardString.toString()); 
      Clipboard.getSystemClipboard().setContent(content); 
     } 
    }); 
    ContextMenu menu = new ContextMenu(); 
    menu.getItems().add(item); 
    tableView.setContextMenu(menu); 
} 

Espero que pueda ayudarlo, o cualquier persona que intente copiar fácilmente los datos de TableView

1

La solución de yelliver solo copia el contenido de las celdas seleccionadas, pero aparentemente solo las celdas que fueron cliqueadas explícitamente se consideran seleccionadas. La solución de Roberto solo funciona si los objetos contenidos en la tabla son iterables. Aquí es una solución general que copia los datos de todas las células en todas las filas seleccionadas:

@SuppressWarnings("rawtypes") 
public void copySelectionToClipboard(final TableView<?> table) { 
    final Set<Integer> rows = new TreeSet<>(); 
    for (final TablePosition tablePosition : table.getSelectionModel().getSelectedCells()) { 
     rows.add(tablePosition.getRow()); 
    } 
    final StringBuilder strb = new StringBuilder(); 
    boolean firstRow = true; 
    for (final Integer row : rows) { 
     if (!firstRow) { 
      strb.append('\n'); 
     } 
     firstRow = false; 
     boolean firstCol = true; 
     for (final TableColumn<?, ?> column : table.getColumns()) { 
      if (!firstCol) { 
       strb.append('\t'); 
      } 
      firstCol = false; 
      final Object cellData = column.getCellData(row); 
      strb.append(cellData == null ? "" : cellData.toString()); 
     } 
    } 
    final ClipboardContent clipboardContent = new ClipboardContent(); 
    clipboardContent.putString(strb.toString()); 
    Clipboard.getSystemClipboard().setContent(clipboardContent); 
} 

Para habilitar la copia con Ctrl + C, añadir

final KeyCodeCombination keyCodeCopy = new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY); 
    table.setOnKeyPressed(event -> { 
     if (keyCodeCopy.match(event)) { 
      copySelectionToClipboard(table); 
     } 
    }); 
Cuestiones relacionadas