Is it possible to allow a user to select rows and copy from a TableView?
I couldn't implement Yelliver's Answer, it doesn't compile for me, but I found another very clear way to extract to clipboard the TableView's multiple selected data, it goes as follows
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);
}
Hope it can help you, or anyone trying to copy easily TableView's data
yelliver's solution only copies the content of selected cells, but apparently only cells that were explicitly clicked on are considered selected. Roberto's solution only works if the objects held in the table are iterable. Here is a general solution that copies the data from all cells in all selected rows:
@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);
}
To enable copying with Ctrl+C, add
final KeyCodeCombination keyCodeCopy = new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY);
table.setOnKeyPressed(event -> {
if (keyCodeCopy.match(event)) {
copySelectionToClipboard(table);
}
});
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With