文章

用javafx和robot类实现截图小工具(未完待续)

用javafx和robot类实现截图小工具

截图操作

首先初始化类和定义组件变量

Robot robot=new Robot();

需要使用一个工具类Toolkit,因为Toolkit是私有的,且没有子类,所以我们只能通过内置的getDefaultToolkit()方法获取它

Toolkit toolkit=Toolkit.getDefaultToolkit();

然后我们就可以通过Toolkit的gitScreensize()方法获取屏幕宽高

Dimension screenSize = toolkit.getScreenSize();

将宽高赋值到变量中

1
2
int width=screenSize.width;
int height=screenSize.height;

使用robot的createScreenCapture()方法截图并接受它的返回图片到BufferedImage 类型里

BufferedImage screenCapture = robot.createScreenCapture(new Rectangle(width, height));

我们在应用中定义了一个ImageView控件,可以显示我们截图后的图片预览,但这个控件只能显示javafx里面的Image,所以我们需要将之前获取到java.awt.Image中的image(也就是前文的BufferedImage )转换为javafx里的image(WritableImage)

WritableImage fxImage = SwingFXUtils.toFXImage(screenCapture, null);

上面转换使用了SwingFXUtils这个类属于 javafx.embed.swing.SwingFXUtils ,这个类是默认不自带的,所以需要我们在maven里添加

1
2
3
4
5
6
<!– https://mvnrepository.com/artifact/org.openjfx/javafx-swing –>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>17.0.6</version>
</dependency>

然后就可以愉快的将它显示在imageview中了(这里的iv是ImageView类型,已经提前声明在Controller中了)

iv.setImage(fxImage);

运行后我们会发现,截图工具把自己的窗口也截进去了,为了解决这个问题,我们首先在Application类中声明我们的舞台

1
2
public static Stage startup_stage=null;
startup_stage=stage;

然后在截图事件触发时调用如下方法,这样我们程序主窗口就隐藏起来了

Application.startup_stage.hide();

在截图完成后使用如下方法重新显示窗口

HelloApplication.startup_stage.show();

未完待续..

本文由作者按照 CC BY 4.0 进行授权