package swing;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.KeyEventPostProcessor;
import java.awt.KeyboardFocusManager;
import java.awt.Label;
import java.awt.MediaTracker;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JWindow;
import javax.swing.filechooser.FileFilter;
/**
* 程序启动界面类 主要实现启动界面及进度条显示
*
* @author Administrator
*
*/
public class JWindowDemo extends JWindow implements Runnable {
// 进度条更新进程
Thread processbarUpdateThread;
// 进度条
JProgressBar processbar;
/**
* 无参构造方法
*/
public JWindowDemo() {
// 声明一个容器
Container container = getContentPane();
// 设置光标
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
// 容器图片
URL imgurl = getClass().getResource("bg.png");
// 如果路径存在则把图片居中显示在容器中
if (imgurl != null) {
container.add(new JLabel(new ImageIcon(imgurl)), BorderLayout.CENTER);
}
// 实例化进度条,进度从1到100
processbar = new JProgressBar(1, 100);
// 设置进度条可描绘文字
processbar.setStringPainted(true);
// 设置进度条显示百分比,初始值为null,通过线程设置值
processbar.setString(null);
// 设置进度条背景色
processbar.setBackground(Color.WHITE);
// 设置进度条前景色
processbar.setForeground(Color.BLUE);
// 把进度条添加到容器的南边(左边)
container.add(processbar, BorderLayout.SOUTH);
// 得到屏幕尺寸
Dimension screenDimension = getToolkit().getScreenSize();
// 窗口适应组件大小
pack();
// 设置窗口位置,位于屏幕中央
setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2);
}
/**
* goStart 启动线程
*/
public void goStart() {
// 窗口显示在前面
this.toFront();
// 实例化进度条更新进程
processbarUpdateThread = new Thread(this);
// 调用线程的start(),启动线程
processbarUpdateThread.start();
}
/**
* run 运行线程
*/
@Override
public void run() {
// 窗口可视化
setVisible(true);
try {
for (int i = 1; i <= 100; i++) {
// 线程休眠
Thread.sleep(10);
// 设置进度条值
processbar.setValue(i + 1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
// 释放窗口
dispose();
// 运行主JFrame程序,进行截图
new InitShotFrame();
}
/**
* main 主函数入口
*
* @param args
*/
public static void main(String[] args) {
JWindowDemo jWindowDemo = new JWindowDemo();
jWindowDemo.goStart();
}
}
/**
* 初始化截图窗体及注册键盘监听
*
* @author Administrator
*
*/
class InitShotFrame extends JFrame {
public InitShotFrame() {
// 实例化截图窗体
JFrame frame = new JFrame("截图");
// 窗体logo
URL url=this.getClass().getResource("logo.png");
ImageIcon logo = new ImageIcon(url);
frame.setIconImage(logo.getImage());
JPanel panel = new JPanel();
JLabel label1 = new JLabel("Ctrl+Alt截图");
label1.setForeground(Color.BLUE);
JLabel label2 = new JLabel("双击左键或单击右键保存");
label2.setForeground(Color.BLUE);
JLabel label3 = new JLabel("Esc退出截屏软件");
label3.setForeground(Color.BLUE);
JLabel label4 = new JLabel("温馨提示:不保存也可以发送到qq");
label4.setForeground(Color.RED);
JLabel label5 = new JLabel("---made by lzl");
label5.setForeground(Color.RED);
// 将标签加到面板中
panel.add(label1);
panel.add(label2);
panel.add(label3);
panel.add(label4);
panel.add(label5);
// 将面板加到窗体中
frame.add(panel);
frame.setSize(200, 140);// 窗体大小
frame.setResizable(false);// 窗体大小不可变
frame.setLocationRelativeTo(null);// 窗体居中
frame.setVisible(true);// 窗体可视化
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭窗体即退出程序
// 获得键盘监听管理器
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
// 同时按下CTRL+ALT按键事件
manager.addKeyEventPostProcessor(new KeyEventPostProcessor() {// 添加事件监听进程
@Override
public boolean postProcessKeyEvent(KeyEvent e) {
// 判断是否同时按下CTRL+ALT,是则进行截图
if (e.isAltDown() && e.isControlDown()) {
try {
// 截图时设置当前窗体不可见
InitShotFrame.this.setVisible(false);
// 开始下一步的截屏处理,区域截取
new AreaScreen();
} catch (Exception e2) {
JOptionPane.showConfirmDialog(null, "出现意外错误!", "系统提示", JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
}
}
return false;
}
});
// 按键ESC退出事件
manager.addKeyEventPostProcessor(new KeyEventPostProcessor() {
@Override
public boolean postProcessKeyEvent(KeyEvent e) {
// 判断是否按下ESC按键
if (KeyEvent.VK_ESCAPE == e.getKeyCode()) {
System.exit(0);// 退出程序
}
return false;
}
});
}
}
/**
* 完成图片截取及保存
*
* @author Administrator
*
*/
class AreaScreen extends JFrame {
public Dimension screenDims = null;// 屏幕大小
public ImageIcon screenImageIcon = null;// 截取的图片
public JLabel imgLabel = null;// 放置截图的标签
private boolean isDrag = false;// 鼠标拖拽标识
private int x = 0;// 鼠标横坐标开始位置
private int y = 0;// 鼠标纵坐标开始位置
private int xEnd = 0;// 鼠标横坐标结束位置
private int yEnd = 0;// 鼠标纵坐标结束位置
public AreaScreen() throws AWTException, InterruptedException {
// 先获取全屏尺寸
screenDims = Toolkit.getDefaultToolkit().getScreenSize();
// 截取全屏图片
screenImageIcon = new ImageIcon(getScreenImage(0, 0, screenDims.width, screenDims.height));
// 将截取的全屏图片放到指定标签上,便于鼠标拖拽事件的操作
imgLabel = new JLabel(screenImageIcon);
// 给指定标签设置全屏图片上移动时的鼠标光标样式(十字架)
imgLabel.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
// 给指定标签设置添加鼠标点击事件监听
imgLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// 点击鼠标右键
if (e.getButton() == MouseEvent.BUTTON3) {
// 释放当前窗口
dispose();
}
}
@Override
public void mousePressed(MouseEvent e) {
// 赋值鼠标横、纵坐标开始位置
x = e.getX();
y = e.getY();
}
/*
* mouseReleased必须发生在 mousePressed 或 mouseDragged 之后
*/
@Override
public void mouseReleased(MouseEvent e) {
// 鼠标不再拖拽
if (isDrag) {
// 赋值鼠标横、纵坐标结束位置
xEnd = e.getX();
yEnd = e.getY();
// 鼠标横坐标结束位置不能小于开始位置
if (xEnd < x) {// 互换位置即从右往左截取
int temp = xEnd;
xEnd = x;
x = temp;
}
// 鼠标纵坐标结束位置不能小于开始位置
if (yEnd < y) {// 互换位置即从右往左截取
int temp = yEnd;
yEnd = y;
y = temp;
}
try {
// 新建一个文件选择器,默认保存文件到桌面
JFileChooser fileChooser = new JFileChooser("C:" + File.separator + "Users" + File.separator
+ "Administrator" + File.separator + "Desktop");
// 弹出保存文件的选择框
fileChooser.setFileFilter(new FileFilter() {
@Override
public String getDescription() {// 文件格式
return ".png";
}
@Override
public boolean accept(File f) {// 文件名
return f.isDirectory() || f.getName().toLowerCase().endsWith(".png");
}
});
// 创建一个等大的图片框
BufferedImage bufferedImage = new BufferedImage(xEnd - x, yEnd - y,
BufferedImage.TYPE_INT_BGR);
// 获得局部截图
Image destImg = getScreenImage(x+1, y+1, xEnd - x -1, yEnd - y -1);
// 将图片框绑定一只画笔g,将image画在bufferedImage上
Graphics g = bufferedImage.getGraphics();
// 把目标局部图片用画笔画出来
g.drawImage(destImg, 0, 0, xEnd - x, yEnd - y, null);
// 清除红色边框
g.setColor(Color.WHITE);
// 选框
g.drawRect(0, 0, xEnd - x, yEnd - y);
// 打开保存文件对话框
int result = fileChooser.showSaveDialog(null);
// 假如获得了选中的文件对象
if (result == JFileChooser.APPROVE_OPTION) {
// 复制图片到剪切板
setClipboardImage(AreaScreen.this, destImg);
// 选择保存文件
File selectFile = fileChooser.getSelectedFile();
String name = selectFile.getName();
if (!name.endsWith("png")) {
String path = selectFile.getAbsolutePath();
selectFile = new File(path + ".png");
for (int i = 0; selectFile.exists(); i++) {
selectFile = new File(path + "(" + i + ").png");
}
}
// 输出图片
ImageIO.write(bufferedImage, "png", selectFile);
// 释放当前窗体
dispose();
} else {// 没有获得要保存的文件
// 复制图片到剪切板
setClipboardImage(AreaScreen.this, destImg);
// 释放当前窗体,退出截图模式
dispose();
}
} catch (IOException e1) {
e1.printStackTrace();
JOptionPane.showConfirmDialog(null, "出现意外错误!", "系统提示", JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
}
}
}
});
// 给指定标签设置添加鼠标拖拽事件监听
imgLabel.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent e) {
// 在拖拽鼠标
if (!isDrag) {
isDrag = true;
}
// 画出拖拽过程中的虚线选框
int endx = e.getX();
int endy = e.getY();
// 全屏图片
BufferedImage bufferedImage = new BufferedImage(screenDims.width, screenDims.height,
BufferedImage.TYPE_INT_BGR);
// 在全屏图片上画线
Graphics g = bufferedImage.getGraphics();
g.drawImage(screenImageIcon.getImage(), 0, 0, screenDims.width, screenDims.height, null);// 画图区域
g.setColor(Color.RED);// 红线
g.drawRect(x, y, endx - x, endy - y);// 选框
// 将画好的图片区域放到指定标签上
imgLabel.setIcon(new ImageIcon(bufferedImage));
}
});
// 清除获取的全屏图片的边框
this.setUndecorated(true);
// 将指定标签加到当前容器中
this.getContentPane().add(imgLabel);
// 设置当前窗体的尺寸
this.setSize(screenDims.width, screenDims.height);
// 设置当前窗体可视化
this.setVisible(true);
// 设置当前窗体状态,水平方向最大化
this.setExtendedState(JFrame.MAXIMIZED_HORIZ);
}
/*
* 复制图片到剪切板
*/
public static void setClipboardImage(JFrame frame, final Image image) {
Transferable trans = new Transferable() {
/*
* 判断当前传输数据的Transferable数据传输对象是否符合DataFlavor对象中的几种数据传输格式
*/
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.imageFlavor.equals(flavor);
}
/*
* 用于返回一个数据传输格式数组
*/
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {DataFlavor.imageFlavor};
}
/*
* 返回一个Transferable数据传输对象,参数flavor用于指定数据传输过程中的格式
*/
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (isDataFlavorSupported(flavor)) {
return image;
}
throw new UnsupportedFlavorException(flavor);
}
};
frame.getToolkit().getSystemClipboard().setContents(trans, null);
}
/*
* 截图方法
*/
public Image getScreenImage(int x, int y, int width, int height) {
// java内置的屏幕自动操作类
Robot robot = null;
// 生成的截图
Image image = null;
try {
robot = new Robot();
// 生成平滑的截图
image = robot.createScreenCapture(new Rectangle(x, y, width, height)).getScaledInstance(width, height,
Image.SCALE_SMOOTH);
// 媒体跟踪器,加载标签上的图片
MediaTracker tracker = new MediaTracker(new Label());
// 给图像一个标识
tracker.addImage(image, 1);
// 在完成加载之后
tracker.waitForID(0);
} catch (AWTException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return image;
}
}
代码写完之后我们需要把项目以jar包形式导出再通过转换工具转换成目标exe程序,即可使用
(1)java项目打jar包 :
1.eclipse下选中项目右键Export-找到Runnable jar file - next - Launch configuration选择jar包内主类-Export destination 选 择导出路径 - Finish
2.idea方式略,站内有相关步骤,这里不一一介绍
(2)jar转换exe参考博文:https://blog.csdn.net/jinny_0019/article/details/80065452
(3)【爱截图.exe】软件下载地址https://download.csdn.net/download/qq_36639124/10837297