【问题标题】:What is the JTable CTRL+C event's name?JTable CTRL+C 事件的名称是什么?
【发布时间】:2013-01-16 11:02:59
【问题描述】:

我正在开发一个 Java 应用程序,当我在 jTable 上按 CTRL+C 时,我可以获取剪贴板并将其粘贴到 Excel 中。我想实现一个做同样事情的按钮。我怎样才能得到函数、监听器,不管是什么我可以用来实现这一点?

PS:我尝试过查看其他问题,但似乎没有人在寻找我想要的。

【问题讨论】:

  • 您希望将整个表格复制到剪贴板上还是某些特定值?你试过一些代码吗?如果是,请发布代码。
  • 您是否尝试为 JTable 单元格提供复制/粘贴功能?
  • 你真的应该像这样的谷歌问题 - 搜索“JTable cut copy paste”出现了这个 - javaworld.com/javatips/jw-javatip77.html 我怀疑它回答了你的问题。

标签: java swing events jtable clipboard


【解决方案1】:

表格复制动作的key是"copy"

Action copyAction = table.getActionMap().get("copy");

但我没有看到回收Action的有用方法:

JButton button = new JButton(copyAction);

相反,只需将表格的当前选择导出到系统剪贴板。

JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TableModel model = new DefaultTableModel(
    new Object[][]{{"Some"}, {"More"}}, new Object[]{"Name"});
final JTable table = new JTable(model);
table.getSelectionModel().setSelectionInterval(0, 1);
f.add(table);
f.add(new JButton(new AbstractAction("Export") {

    @Override
    public void actionPerformed(ActionEvent e) {
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        table.getTransferHandler().exportToClipboard(
            table, clipboard, TransferHandler.COPY);
        Transferable contents = clipboard.getContents(null);
    }
}), BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);

附录:此变体依赖于TableTransferable

final DefaultTableModel model = new DefaultTableModel(
    new Object[][]{
    {"A1", "A2", "A3", "A4", "A5"},
    {"B1", "B2", "B3", "B4", "B5"},
    {"C1", "C2", "C3", "C4", "C5"},
    {"D1", "D2", "D3", "D4", "D5"},
    {"E1", "E2", "E3", "E4", "E5"},
    {"F1", "F2", "F3", "F4", "F5"}
},
    new Object[]{"1", "2", "3", "4", "5"});
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTable table = new JTable(model);
table.getSelectionModel().setSelectionInterval(0, 1);
f.add(table);
f.add(new JButton(new AbstractAction("Export") {
    @Override
    public void actionPerformed(ActionEvent e) {
        Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
        cb.setContents(new TableTransferable(model), new ClipboardOwner() {
            @Override
            public void lostOwnership(Clipboard clipboard, Transferable contents) {
                System.out.println("Clipboard lost!");
            }
        });
    }
}), BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);

【讨论】:

  • 既然你提出来了——我很好奇——为什么回收行动不起作用?
  • 好问题;在内部,L&F 委托给TransferHandler,所以在导出之前似乎什么都没有发生。
  • 在这种情况下回收动作不起作用,因为源组件是按钮,而不是表格。我提供了一个替代答案来解决这个问题。
【解决方案2】:

但我没有看到回收操作的有用方法:

您不能以这种方式使用 Action,因为 Action 的来源是按钮而不是表格。

请参阅Action Map Action 了解通用解决方案。使用提供的类,代码将是:

Action copyAction = new ActionMapAction("Copy Table", table, "copy");
JButton copyButton = new JButton(copyAction);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2017-08-30
    • 2017-03-09
    • 2015-10-26
    • 2019-04-24
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多