Program terminated before finishing copying values to clipboard

25 views Asked by At

I created a simple Java program to capture a screenshot and save it to the clipboard.
The code below does not do anything until I added Thread.sleep(2000); to the end of the main method.

Is there a proper way to wait the copy operation finished?

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Optional;
import java.util.stream.Stream;

public class ScreenShot {
    public static void main(String[] args) throws Exception {
        Robot robot = new Robot();
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension dimension = toolkit.getScreenSize();
        Rectangle rectangle = new Rectangle(dimension);
        BufferedImage image = robot.createScreenCapture(rectangle);
        toolkit
                .getSystemClipboard()
                .setContents(toTransferable(image), null);
    }

    public static Transferable toTransferable(BufferedImage image) {
        return new Transferable() {
            @Override
            public boolean isDataFlavorSupported(DataFlavor flavor) {
                return Stream
                        .of(getTransferDataFlavors())
                        .anyMatch(flavor::equals);
            }

            @Override
            public DataFlavor[] getTransferDataFlavors() {
                return new DataFlavor[] { DataFlavor.imageFlavor };
            }

            @Override
            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
                Object value = Optional
                        .of(flavor.equals(DataFlavor.imageFlavor) && image != null)
                        .filter(Boolean::booleanValue)
                        .map(b -> image)
                        .orElseThrow(() -> new UnsupportedFlavorException(flavor));
                System.out.println(value);
                return value;
            }
        };
    }
}

System info:

OS: Debian GNU/Linux 12 (bookworm) aarch64 
Host: Apple MacBook Air (M1, 2020) 
Kernel: 6.5.0-asahi-00780-g62806c2c6f29 
DE: LXQt 1.2.0 
WM: Xfwm4 
java 17.0.9 2023-10-17 LTS
Java(TM) SE Runtime Environment Oracle GraalVM 17.0.9+11.1 (build 17.0.9+11-LTS-jvmci-23.0-b21)
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 17.0.9+11.1 (build 17.0.9+11-LTS-jvmci-23.0-b21, mixed mode, sharing)
0

There are 0 answers