B4J Code Snippet B4J Copy files to the clipboard.

I needed a system to copy files to the clipboard just like CTRL-C. I don't think B4J can do it.
So I did it in JAVA and compiled a .jar file.
Return a list with the full path and file name (C:\myfolder\myfile.ext) this works with any type of file (txt, pdf, docx, etc...)
The JAVA code was written with Notepad++ and compiled with a .bat file.
For those who are interested, here's the procedure. You don't have to do this, as I've attached the JAR file.

Expected file structure for compilation.
your_folder/

├── compile_clipboard_jar.bat
├── src/
│ └── b4j/
│ └── helper/
│ └── ClipboardFileCopier.java

Java:
package b4j.helper;

import java.awt.*;
import java.awt.datatransfer.*;
import java.io.File;
import java.util.List;
import java.util.ArrayList;

public class ClipboardFileCopier {

   public static void copyFilesToClipboard(java.util.List<String> filePaths) {
    java.util.List<File> files = new java.util.ArrayList<>();
    for (String path : filePaths) {
        File file = new File(path);
        if (file.exists()) {
            files.add(file);
        }
    }

    if (!files.isEmpty()) {
        FileTransferable ft = new FileTransferable(files);
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.setContents(ft, null);
    }
}

    

    static class FileTransferable implements Transferable {
        private final List<File> files;

        public FileTransferable(List<File> files) {
            this.files = files;
        }

        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[] { DataFlavor.javaFileListFlavor };
        }

        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return DataFlavor.javaFileListFlavor.equals(flavor);
        }

        public Object getTransferData(DataFlavor flavor) {
            return files;
        }
    }
}

.bat File:
@echo off
setlocal

:: Directory containing the Java file
set SRC_DIR=src
:: Output directory for compiled classes
set BIN_DIR=bin
:: Final JAR file name
set JAR_NAME=ClipboardFileCopier.jar
:: Package name + main class
set MAIN_CLASS=b4j.helper.ClipboardFileCopier

:: Creation of folder if necessary
if not exist %BIN_DIR% mkdir %BIN_DIR%

:: Compiling the Java class
echo Compiling the Java class...
javac -encoding UTF-8 -d %BIN_DIR% %SRC_DIR%\b4j\helper\ClipboardFileCopier.java

:: Creation of the MANIFEST file
echo Manifest-Version: 1.0> manifest.txt
echo Main-Class: %MAIN_CLASS%>> manifest.txt

:: Creating the JAR file
echo creating the JAR file...
jar cfm %JAR_NAME% manifest.txt -C %BIN_DIR% .

:: Cleaning
del manifest.txt

echo.
echo ✅ Done! The file %JAR_NAME% is ready.
pause

For B4J
Put the JAR file in the additional libraries folder.

Add
B4J:
#AdditionalJar: ClipboardFileCopier.jar

and use
B4J:
Private Sub CopyToClipboard(l As List)
    Dim jo As JavaObject
    jo.InitializeStatic("b4j.helper.ClipboardFileCopier")
    jo.RunMethod("copyFilesToClipboard", Array(l))
End Sub

Have fun
 

Attachments

  • ClipboardFileCopier.jar
    2.1 KB · Views: 107
  • ClipboardFileCopier.java
    2.1 KB · Views: 104
  • bat_File_compile_clipboard_jar.zip
    682 bytes · Views: 101

Mariano Ismael Castro

Active Member
Licensed User
Longtime User
Hello, thank you very much for sharing your code, it works very well. This is another way that also works, using Java Inline. I have placed your code on a B4XMainPage class.

Java Inline:
Private Sub Button1_Click
    Dim listFile As List = Array("C:\Users\DELL I7 7MA\Documents\document.pdf")
    Dim jo As JavaObject = Me
    jo.RunMethod("copyFilesToClipboard", Array(listFile))
End Sub

#If Java
import java.awt.*;
import java.awt.datatransfer.*;
import java.io.File;
import java.util.List;
import java.util.ArrayList;

public void copyFilesToClipboard(java.util.List<String> filePaths)
{
   java.util.List<File> files = new java.util.ArrayList<>();
   for (String path : filePaths)
   {
      File file = new File(path);
      if (file.exists())
      {
        files.add(file);
      }
    }

    if (!files.isEmpty())
    {
       FileTransferable ft = new FileTransferable(files);
       Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
       clipboard.setContents(ft, null);
    }
}
    
class FileTransferable implements Transferable
{
    private final List<File> files;
      public FileTransferable(List<File> files)
    {
       this.files = files;
    }

    public DataFlavor[] getTransferDataFlavors()
    {
       return new DataFlavor[] { DataFlavor.javaFileListFlavor };
    }

    public boolean isDataFlavorSupported(DataFlavor flavor)
    {
       return DataFlavor.javaFileListFlavor.equals(flavor);
    }

    public Object getTransferData(DataFlavor flavor)
    {
            return files;
    }
}
#End If
 

zed

Well-Known Member
Licensed User
Of course it will work. But I find the code is cleaner with a JAR.
That's why I put the whole procedure. If someone prefers a JAR instead of the code, they can compile it with a bat file. To each their own way.
 
Top