【问题标题】:Copying text to the clipboard using Java使用 Java 将文本复制到剪贴板
【发布时间】:2011-10-06 07:46:33
【问题描述】:

我想将文本从JTable 的单元格复制到剪贴板,以便将其粘贴到其他程序中,例如 Microsoft Word。我有来自JTable 的文本,但我不确定如何将其复制到剪贴板。

【问题讨论】:

    标签: java swing text clipboard


    【解决方案1】:

    这对我有用,而且非常简单:

    导入这些:

    import java.awt.datatransfer.StringSelection;
    import java.awt.Toolkit;
    import java.awt.datatransfer.Clipboard;
    

    然后将这段 sn-p 代码放在您想要更改剪贴板的任何位置:

    String myString = "This text will be copied into clipboard";
    StringSelection stringSelection = new StringSelection(myString);
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(stringSelection, null);
    

    【讨论】:

    • 我们也可以和所有者一起 setContents() stackoverflow.com/questions/3591945/…
    • @AquariusPower 似乎也将stringSelection 作为setContents(..) 的第二个参数传递,使其成为ClipboardOwner,如链接的答案一样,没有意义:查看source ,它实现的ClipboardOwner的唯一方法,即lostOwnership(..),是空的。所以,第二个参数似乎是一个完全可选的回调。
    • @EvgeniSergeev 如果我们扩展 StringSelection 可能会有用 :)
    • 移植到 Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
    • 你在什么情况下测试了这个?来自 GUI 应用程序?在哪个平台上?它是否可以连续设置剪贴板 100 次(每组之间有适当的停顿)?
    【解决方案2】:

    这是以装饰方式编写的公认答案:

    Toolkit.getDefaultToolkit()
            .getSystemClipboard()
            .setContents(
                    new StringSelection(txtMySQLScript.getText()),
                    null
            );
    

    【讨论】:

      【解决方案3】:

      以下类允许您将字符串复制/粘贴到剪贴板。

      import java.awt.*;
      import java.awt.datatransfer.Clipboard;
      import java.awt.datatransfer.DataFlavor;
      import java.awt.datatransfer.StringSelection;
      
      import static java.awt.event.KeyEvent.*;
      import static org.apache.commons.lang3.SystemUtils.IS_OS_MAC;
      
      public class SystemClipboard
      {
          public static void copy(String text)
          {
              Clipboard clipboard = getSystemClipboard();
              clipboard.setContents(new StringSelection(text), null);
          }
      
          public static void paste() throws AWTException
          {
              Robot robot = new Robot();
      
              int controlKey = IS_OS_MAC ? VK_META : VK_CONTROL;
              robot.keyPress(controlKey);
              robot.keyPress(VK_V);
              robot.keyRelease(controlKey);
              robot.keyRelease(VK_V);
          }
      
          public static String get() throws Exception
          {
              Clipboard systemClipboard = getSystemClipboard();
              DataFlavor dataFlavor = DataFlavor.stringFlavor;
      
              if (systemClipboard.isDataFlavorAvailable(dataFlavor))
              {
                  Object text = systemClipboard.getData(dataFlavor);
                  return (String) text;
              }
      
              return null;
          }
      
          private static Clipboard getSystemClipboard()
          {
              Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
              return defaultToolkit.getSystemClipboard();
          }
      }
      

      【讨论】:

      • 在 OS X 中粘贴可能需要一些逻辑,因为它很特殊。
      • @BenLeggiero:迟到的答案,但随时建议进行编辑以更好地支持OS X,以防它无法正常工作
      • 如果我需要再次执行此操作,我会更新。很可能,它只是检查当前的操作系统,如果是 macOS,则将VK_CONTROL 换成VK_META
      • 这是我需要的。
      【解决方案4】:

      适用于基于 JavaFx 的应用程序。

              //returns System Clipboard
              final Clipboard clipboard = Clipboard.getSystemClipboard();
              // ClipboardContent provides flexibility to store data in different formats
              final ClipboardContent content = new ClipboardContent();
              content.putString("Some text");
              content.putHtml("<b>Some</b> text");
              //this will be replaced by previous putString
              content.putString("Some different text");
              //set the content to clipboard
              clipboard.setContent(content);
             // validate before retrieving it
              if(clipboard.hasContent(DataFormat.HTML)){
                  System.out.println(clipboard.getHtml());
              }
              if(clipboard.hasString()){
                  System.out.println(clipboard.getString());
              }
      

      ClipboardContent可以以多种数据格式保存多个数据,例如(html、url、纯文本、图像)。

      欲了解更多信息,请参阅official documentation

      【讨论】:

        【解决方案5】:

        我找到了一种更好的方法,这样您就可以从 txtbox 获取输入,或者在该文本框中生成一些内容,然后单击按钮来执行此操作。!

        import java.awt.datatransfer.*;
        import java.awt.Toolkit;
        
        private void /* Action performed when the copy to clipboard button is clicked */ {
            String ctc = txtCommand.getText().toString();
            StringSelection stringSelection = new StringSelection(ctc);
            Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard();
            clpbrd.setContents(stringSelection, null);
        }
        
        // txtCommand is the variable of a text box
        

        【讨论】:

        • “2017/2018”是什么意思?特定版本的 Java?您使用的是哪个版本
        【解决方案6】:

        供参考:

        static void copyToClipboard(String text) {
            java.awt.Toolkit.getDefaultToolkit().getSystemClipboard()
                .setContents(new java.awt.datatransfer.StringSelection(text), null);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-31
          相关资源
          最近更新 更多