默认情况下,当您尝试从JTable
进行复制时,正在复制的值的toString
方法将被发送到剪贴板。如何为一类对象更改此行为?
假设我有一个带有两列的表,为简单起见。第一列中包含Boolean
,第二列包含String
s。目前,当您复制Boolean
时,您会收到true
或false
。如何更改此行为以在剪贴板上放置任意字符串(例如t
为true
而f
为false
),而不更改String
的复制行为}?
这是一个SSCCE,您可以从JTable
复制/粘贴。
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.table.AbstractTableModel;
public class ChangeCopyBehavior {
private static class TestModel extends AbstractTableModel {
private static final long serialVersionUID = -774558262249729206L;
@Override
public int getRowCount() {
return 4;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Class<?> getColumnClass(int col) {
return col == 0 ? Boolean.class : String.class;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 1) {
return "String";
} else {
return rowIndex % 2 == 0;
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JTable table = new JTable(new TestModel());
table.setCellSelectionEnabled(true);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JScrollPane(table), BorderLayout.CENTER);
panel.add(new JTextArea("Paste stuff here"), BorderLayout.SOUTH);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
});
}
}
答案 0 :(得分:4)
创建自定义TransferHandler,以您想要的任何格式导出数据。
以下是Swing教程中旧ExtendedDnDDemo的链接,其中显示了自定义TableTransferHandler的示例。
答案 1 :(得分:2)
请参阅this SO question,其中我使用SwingX JXTable
举例说明custom copy-behavior。但是,同样的方法可以与常规JTable