Скопируйте данные из JTable как HTML - PullRequest
2 голосов
/ 10 декабря 2011

По умолчанию TransferHandler JTable экспортирует данные в формате с разделителями табуляции.Я пытаюсь создать свой собственный TransferHandler, который будет экспортировать данные в виде таблицы 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 Transferable:

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

1 Ответ

2 голосов
/ 12 декабря 2011

Там только один кусок отсутствует.Вам необходимо реализовать TransferHandler.getSourceActions, например так:

public class TableTransferHandler extends TransferHandler {
    ...
    @Override
    public int getSourceActions(JComponent c) {
        return COPY;
    }
}

EDIT : это работает в Mac OS X. Но в Windows работает вставка в блокнот или WordPad, но не в OpenOffice calc,После некоторых исследований, я думаю, что в Java AWT и OpenOffice произошла ошибка:

  • Java создает следующий формат буфера обмена HTML:

    Версия: 0.9
    StartHTML:-1
    EndHTML: -1
    ...

Эти двое -1 не правы.Они должны быть положительными числами смещения.Существует знаю, ошибка JDK , которая очень близка к тому, что у вас здесь.
  • OpenOffice, с другой стороны, не может обработать такой частично правильный формат буфера обмена, в то время как блокнот или WordPad могут.Есть 7300 + (!) Открытых ошибок , если вы ищете 'paste html calc' в базе данных OpenOffice bugzilla.
...