JTable по умолчанию TransferHandler экспортирует данные в формате с разделителями табуляции. Я пытаюсь создать свой собственный TransferHandler, который будет экспортировать данные в виде таблицы HTML, но в настоящее время ничего не копируется в буфер обмена, когда я его использую. Как добавить эту функцию?Скопируйте данные из JTable в качестве HTML
В настоящее время я добавляю следующее TransferHandler к моему столу с помощью table.setTransferHandler(new TableTransferHandler());
:
public class TableTransferHandler extends TransferHandler {
final static Logger logger = LoggerFactory.getLogger("TableTransferHandler");
@Override
protected Transferable createTransferable(JComponent comp) {
JTable table = (JTable) comp;
logger.debug("creating table selection transferable");
return new TableSelection(table);
}
}
TableSelection
Переводной:
public class TableSelection implements Transferable {
final static Logger logger = LoggerFactory.getLogger("TableSelection");
private static DataFlavor HTML_TEXT;
private static final List<DataFlavor> flavors = new ArrayList<DataFlavor>();
private JTable table;
public TableSelection(JTable table) {
this.table = table;
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavors.contains(flavor);
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return flavors.toArray(new DataFlavor[0]);
}
@Override
public Object getTransferData(DataFlavor flavor) throws IOException, UnsupportedFlavorException {
if (flavor.equals(HTML_TEXT)) {
StringBuilder sb = new StringBuilder("<table>");
int[] rows = table.getSelectedRows();
int[] cols = table.getSelectedColumns();
for (int row : rows) {
int col_index = 0;
sb.append("<tr><td>");
for (int col : cols) {
Object value = table.getValueAt(row, col);
if (value != null)
sb.append(value.toString());
if (col_index + 1 < cols.length)
sb.append("</td><td>");
}
sb.append("</td></tr>\n");
}
sb.append("</table>");
return sb.toString();
}
else {
throw new UnsupportedFlavorException(flavor);
}
}
static {
try {
HTML_TEXT = new DataFlavor("text/html;class=java.lang.String");
flavors.add(HTML_TEXT);
}
catch (ClassNotFoundException e) {
logger.error("Couldn't create HTML_TEXT flavor", e);
}
}
}
Что вы имеете в виду, ничего не копируется в буфер обмена. Является ли ваша передача не созданной? И как вы ожидаете, что это сработает. Ваш переносимый содержит только один dataflavor, который является приватным. Итак, как кто-нибудь сможет получить данные из вашего перевода, если у них нет доступа к аромату? – Robin
После CTRL + C на столе я получаю ранее скопированный текст, а не данные из таблицы. Я мог бы сделать все это неправильно, так как это моя первая попытка использовать TransferHandlers. –
Я думал, что [обработчик по умолчанию] (http://docs.oracle.com/javase/1.5.0/docs/guide/swing/1.4/dnd.html#DefaultTransferHandlerSupport) сделал это, но установил 'setDragEnabled (true)' скопированный простой текст. – trashgod