2012-07-05 132 views

回答

0

我不知道,但我猜javafx.scene.input.Clipboard可以幫助你在這裏。

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

我無法實現Yelliver的答案,它不會編譯的我,但我發現了另一個非常明確的方式來解壓到剪貼板中的TableView的多重選擇的數據,這是不言而喻如下

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

希望它可以幫助你或任何試圖輕易複製TableView數據的人

1

yelliver的解決方案只複製選定單元格的內容,但顯然只有被明確點擊過的單元格才被選中。如果表中的對象是可迭代的,Roberto的解決方案纔有效。 這裏是一個一般的解決方案,拷貝來自所有小區中的所有選擇的行中的數據:

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

爲了使複印用Ctrl + C,添加

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