JTable到Windows剪贴板



我正试图将JTable的内容放到Windows系统剪贴板上。我的基本方法概述如下。

StringBuilder sbf = new StringBuilder();
for (i=0; i<numrows; i++) {
for (j=0; j<numcols; j++) {
sbf.append(jTable1.getValueAt(i, j) );
if (j<numcols-1) sbf.append("t");
}
sbf.append("n");
}
StringSelection stsel = new StringSelection(sbf.toString());
system = Toolkit.getDefaultToolkit().getSystemClipboard();
system.setContents(stsel,stsel);

上面的方法对于适度的数据集非常有效。对于稍大的数据集,我可以通过使用构造函数StringBuilder(int capacity)来避免OutOfMemoryError,因为我有一个字符计数的估计。不幸的是,对于更大的数据集,这也会生成OutOfMemoryError

我的问题是"我怎样才能得到一个" big -ish"把JTable放到剪贴板上?"我不想在JVM上使用-Xms,也不需要StringBuilder对象,除非如上所示。如果可以在没有中间StringBuilder的情况下完成,我希望JVM只需要少量的额外内存来执行此操作,因为我已经在JTable中拥有了数据,并且新的分配是针对操作系统的,而不是JVM。虽然不可取,但我愿意使用临时文件,但是一旦文件被写入,我不知道如何为这个文件打开一个流到剪贴板。是否有可能使用某种形式的PipedOutputStream或…,理想情况下没有临时文件?

2022年7月更新:我发现我们办公室大多数Win10机器上的默认JRE通常是1.8.0_212。对于本例中的数据量,在1.8.0_291中不会出现这个问题。是的,我知道它们现在都很老了,但我目前并没有强迫人们升级他们的默认安装。正如您所料,与JDK 17.0.3.1捆绑在一起的最新版本也不会出现这个问题。目前还不确定更大的数据集会发生什么。因此,这个问题似乎不是问题,这取决于用户的JRE以及您是否愿意强制他们升级。希望有人觉得这有用。再次感谢所有人的帮助和输入!

Swing已经可以这样做了:

jTable1.selectAll();
jTable1.getTransferHandler().exportToClipboard(jTable1,
jTable1.getToolkit().getSystemClipboard(),
TransferHandler.COPY);

最新更新