2012-07-05 32 views

risposta

0

Non sono sicuro, ma suppongo che javafx.scene.input.Clipboard possa aiutarti qui.

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

non ho potuto implementare risposta di Yelliver, non si compila per me, ma ho trovato un altro modo molto chiaro per estrarre negli appunti più dati selezionati del Tableview, va come segue

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

Spero che possa aiutarti, o chiunque cerchi di copiare facilmente i dati di TableView

1

La soluzione di yelliver copia solo il contenuto delle celle selezionate, ma apparentemente solo le celle su cui è stato fatto clic in modo esplicito sono considerate selezionate. La soluzione di Roberto funziona solo se gli oggetti contenuti nella tabella sono iterabili. Ecco una soluzione generale che copia i dati da tutte le cellule in tutte le righe selezionate:

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

Per consentire la copia con Ctrl + C, aggiungere

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