import java.awt.EventQueue;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javax.imageio.ImageIO;
public class ScreenCapture extends Application {
private static ScreenCapture screenCapture;
private Stage stage;
public Rectangle screenBounds;
private Rebounder rebounder;
private GlassPane glassPane;
public static ScreenCapture getScreenCapture() {
return screenCapture;
}
@Override
public void start(Stage primaryStage) {
screenCapture = this;
stage = primaryStage;
Group group = new Group();
Scene scene = new Scene(group);
scene.setFill(Color.TRANSPARENT);
scene.setCursor(Cursor.CROSSHAIR);
primaryStage.initStyle(StageStyle.TRANSPARENT);
primaryStage.setFullScreen(true);
primaryStage.setScene(scene);
primaryStage.show();
screenBounds = new Rectangle(
Screen.getPrimary().getBounds().getWidth(), Screen.getPrimary()
.getBounds().getHeight());
KeyPane keyPane = new KeyPane(primaryStage, rebounder = new Rebounder());
glassPane = new GlassPane();
glassPane.setShape(rebounder.shapeBuilder(null), true);
group.getChildren().addAll(
new Node[] { (Node) keyPane, (Node) glassPane,
(Node) rebounder.getLasso() });
scene.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent me) {
glassPane.setShape(
rebounder.shapeBuilder(rebounder.start(me.getX(),
me.getY())), false);
}
});
scene.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent me) {
glassPane.setShape(rebounder.shapeBuilder(rebounder.rebound(
me.getX() + 1, me.getY() + 1)), false);
}
});
scene.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent me) {
if (!rebounder.isStopped()) {
capture(rebounder.stop(me.getX() + 1, me.getY() + 1));
}
}
});
}
public void capture(final Rectangle finished) {
stage.setWidth(0);
stage.setHeight(0);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
if ((((finished.getWidth() - 1) * (finished.getHeight() - 1)) > 0.0d)) {
try {
Robot robot = new Robot();
BufferedImage img = robot
.createScreenCapture(new java.awt.Rectangle(
(int) finished.getX(), (int) finished
.getY(), (int) finished
.getWidth() - 1, (int) finished
.getHeight() - 1));
File folder = new File(System.getProperty("user.home"),
"snapshots");
folder.mkdirs();
File file = File.createTempFile("jfx2_screen_capture",
".jpg", folder);
ImageIO.write(img, "jpg", file);
} catch (Exception ex) {
Logger.getLogger(ScreenCapture.class.getName()).log(
Level.SEVERE, null, ex);
}
}
Platform.runLater(new Runnable() {
@Override
public void run() {
glassPane.setShape(rebounder.shapeBuilder(null), true);
stage.setWidth(screenBounds.getWidth());
stage.setHeight(screenBounds.getHeight());
}
});
}
});
}
public static void main(String[] args) {
launch(args);
}
}