【问题标题】:Change copy behavior of a JTable cell更改 JTable 单元格的复制行为
【发布时间】:2012-01-18 02:35:01
【问题描述】:

默认情况下,当您尝试从JTable 复制时,被复制值的toString 方法会发送到剪贴板。如何更改一类对象的这种行为?

为了简单起见,假设我有一个包含两列的表格。第一列包含Booleans,第二列包含Strings。目前,当您复制Boolean 时,您会得到truefalse。如何更改此行为以在剪贴板上放置任意字符串(例如 t 用于 truef 用于 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);
            }
        });
    }
}

【问题讨论】:

标签: java swing drag-and-drop jtable copy-paste


【解决方案1】:

创建一个自定义 TransferHandler 以您想要的任何格式导出数据。

这里是 Swing 教程中旧的 ExtendedDnDDemo 的链接,其中显示了自定义 TableTransferHandler 的示例。

【讨论】:

    【解决方案2】:

    请参阅this SO question,其中我使用 SwingX JXTable 给出了 custom copy-behavior 的示例。但是,同样的方法可以用于普通的JTable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2011-08-06
      • 2011-11-03
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多