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)