JavaSwing版完整截图小软件设计(二)
上一篇基础功能的实现请见:
https://blog.csdn.net/rico_zhou/article/details/80062882
screenshot2.0版本实现功能主要如下:
1.自定义保存图片路径
2.图片格式自定义
3.开机自启动,启动最小化
4.截图,退出快捷键不能与其他系统软件冲突,但是保存,复制,撤销,取消的快捷键支持任意快捷键
5.新增设置功能,截图带光标,显示放大镜,显示像素,添加文字,椭圆标注,马赛克功能,撤销功能,直线标注,圆形标注,圆角矩形标注,矩形标注,曲线标注,显示坐标轴等功能自定义
6.鼠标单击设置,双击设置
7.鼠标右键菜单
8.是否注册成Windows服务(暂未实现)
9.设置立即生效,不再需要重启
先上几张图
基础设置图
高级设置图
截图状态下图
右键菜单
贴出部分代码,源码请见github
初始化主题
// 初始化主题
private void initTheme() {
// 国人牛逼主题,值得学习
// 初始化字体
InitGlobalFont(new Font("微软雅黑", Font.PLAIN, 13));
// 设置本属性将改变窗口边框样式定义
// 系统默认样式 osLookAndFeelDecorated
// 强立体半透明 translucencyAppleLike
// 弱立体感半透明 translucencySmallShadow
// 普通不透明 generalNoTranslucencyShadow
BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.generalNoTranslucencyShadow;
// 设置主题为BeautyEye
try {
org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
} catch (Exception e) {
e.printStackTrace();
}
// 隐藏“设置”按钮
UIManager.put("RootPane.setupButtonVisible", false);
// 开启/关闭窗口在不活动时的半透明效果
// 设置此开关量为false即表示关闭之,BeautyEye LNF中默认是true
BeautyEyeLNFHelper.translucencyAtFrameInactive = false;
// 设置BeantuEye外观下JTabbedPane的左缩进
// 改变InsetsUIResource参数的值即可实现
UIManager.put("TabbedPane.tabAreaInsets", new javax.swing.plaf.InsetsUIResource(3, 20, 2, 20));
//
// 切换主题,此主题在圆形窗口有标题栏
try {
// UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
}
初始化其他
// 初始化,检查是否已启动,是否最小化托盘
private void initFirst() {
// 是否已启动,启动则退出
if (!su.checkSocket(ssmm.getPort() != 0 ? ssmm.getPort() : 12345)) {
// JOptionPane.showMessageDialog(null, "程序已启动!请勿重复启动!", "提示消息",
// JOptionPane.WARNING_MESSAGE);
System.exit(0);
}
}
// 设置最小化
public void setJFMinSize() {
// 是否最小化托盘
try {
// 若不支持托盘或者初始化失败,则提示
if (!minimizeTray()) {
JOptionPane.showMessageDialog(null, "系统不支持托盘!", "提示消息", JOptionPane.WARNING_MESSAGE);
return;
}
dispose();
} catch (AWTException e1) {
e1.printStackTrace();
}
}
// 初始化配置
public void initPro() {
// 初始化按键对照表
su.initKeyMap();
// 原理:首先判断exe所在目录是否存在隐藏的配置文件screentshotsetup.properties,
// 如果存在,则读取此配置文件,如果不存在则生成一个默认的隐藏的配置文件
// 实例化一个参数对象
// 这个是用于设置具体参数
// sm = new SetupMsg();
// 这个是用于显示具体参数
sp = new SetupParams();
File f = new File("screentshotsetup.properties");
// 判断是否存在文件
fileExit = su.isFileExit(f);
if (fileExit) {
// 获取默认配置信息
try {
// 获取显示参数
sp = su.getDefaultMsg(f);
// ScreenShotMainGUI.sspp = sp;
// 转化为使用参数
ssmm = su.trunSm(sp);
} catch (Exception e1) {
ssmm = new SetupMsg();
e1.printStackTrace();
}
}
}
热键监听
// 第二步:添加热键监听器
JIntellitype.getInstance().addHotKeyListener(new HotkeyListener() {
public void onHotKey(int markCode) {
switch (markCode) {
case SSHOT_KEY_MARK:
if (ScreenShotMainGUI.isOpenSetupJF == true) {
// 设置界面打开时,禁止截图程序
su.proKeyBeforeSshot(SSHOT_KEY_MARK, ssmm);
return;
}
startScreenShot();
break;
case EXIT_KEY_MARK:
if (ScreenShotMainGUI.isOpenSetupJF == true) {
// 设置界面打开时,禁止截图程序
su.proKeyBeforeSshot(EXIT_KEY_MARK, ssmm);
return;
}
System.exit(0);
break;
case EXIT_CURR_KEY_MARK:
if (ScreenShotMainGUI.isOpenSetupJF == true) {
// 设置界面打开时,禁止截图程序
su.proKeyBeforeSshot(EXIT_CURR_KEY_MARK, ssmm);
return;
}
exitCurrScreenShot();
break;
case SAVE_KEY_MARK:
if (ScreenShotMainGUI.isOpenSetupJF == true) {
// 设置界面打开时,禁止截图程序
su.proKeyBeforeSshot(SAVE_KEY_MARK, ssmm);
return;
}
saveCurrSshot();
break;
case CUT_KEY_MARK:
if (ScreenShotMainGUI.isOpenSetupJF == true) {
// 设置界面打开时,禁止截图程序
su.proKeyBeforeSshot(CUT_KEY_MARK, ssmm);
return;
}
cutCurrSshot();
break;
case BACK_KEY_MARK:
if (ScreenShotMainGUI.isOpenSetupJF == true) {
// 设置界面打开时,禁止截图程序
su.proKeyBeforeSshot(BACK_KEY_MARK, ssmm);
return;
}
backSshot();
break;
}
其他代码请见源码github。
最后打包请见
https://blog.csdn.net/rico_zhou/article/details/79868129
精简jre请见
https://blog.csdn.net/rico_zhou/article/details/80255555
制作安装版exe请见
提示:
若启动错误显示端口被占用(默认12345),则修改设置文件,添加(修改)port=xxx,保存并启动
如需抗锯齿处理,请在所有画笔处设置
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);