java swing 实现的带启动界面的【爱截图.exe】截图软件,启动界面有进度条,可选择保存路径及粘贴到qq,微信等

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值