2012-07-05 3 views

Répondre

0

Je ne suis pas sûr, mais je suppose que javafx.scene.input.Clipboard peut vous aider ici.

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

Je ne pouvais pas mettre en œuvre la réponse de Yelliver, il ne compile pas pour moi, mais je l'ai trouvé une autre façon très claire pour extraire le presse-papiers multiples données sélectionnées du tableView, il se présente comme suit

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

Espérons que cela puisse vous aider, ou quiconque essayant de copier facilement les données de TableView

1

La solution de yelliver copie seulement le contenu des cellules sélectionnées, mais apparemment seules les cellules sur lesquelles on a cliqué explicitement sont considérées comme sélectionnées. La solution de Roberto ne fonctionne que si les objets contenus dans la table sont itérables. Voici une solution générale qui copie les données de toutes les cellules de toutes les lignes sélectionnées:

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

Pour activer la copie avec Ctrl + C, ajouter

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