java - 将 JTable 中的数据复制为 HTML

标签 java swing copy jtable data-transfer-objects

JTable 的默认 TransferHandler 以制表符分隔格式导出数据。我正在尝试创建自己的 TransferHandler,它将数据导出为 HTML 表格,但目前没有在我使用它时被复制到剪贴板。如何添加此功能?

目前,我正在使用 table.setTransferHandler(new TableTransferHandler()); 将以下 TransferHandler 添加到我的表中:

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

最佳答案

只少了一件。您需要实现 TransferHandler.getSourceActions,如下所示:

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

编辑:这适用于 Mac OS X。但在 Windows 上,可以粘贴到记事本或写字板,但不能粘贴到 OpenOffice calc。经过一番调查,我认为 Java AWT 和 OpenOffice 都有错误:

  • Java 生成以下 HTML 剪贴板格式:

    Version:0.9
    StartHTML:-1
    EndHTML:-1
    ...

那两个 -1 是错误的。它们应该是一些正偏移数。有一个 know JDK bug这与您在这里所拥有的非常接近。

  • 另一方面,OpenOffice 无法处理这种部分正确的剪贴板格式,而记事本或写字板可以。有7300+ (!) open bugs如果您在 OpenOffice bugzilla 数据库中搜索“粘贴 html 计算”。

关于java - 将 JTable 中的数据复制为 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452157/

相关文章:

java - Mockito 的验证和参数捕获器的工作

java - 最佳工厂实现

java - 处理自己滚动的 JTabel 替代方案

带有复制构造函数的 C++ 不能很好地工作

java - onActivityResult 请求代码返回 0

java - 在 Android 中使用 ListView 实现 AutoComplete

java - JTree 线型和 Nimbus

java - 设计模式: multiple swing interfaces listen for thread variable

php - 使用不同表中的关系复制 mysql 中的记录

bash - 将子目录中的特定文件复制到一个目录中