[Java] 企业QQ →→→→→进入此内容的聊天室

来自 , 2019-11-01, 写在 Java, 查看 118 次.
URL http://www.code666.cn/view/d88518ac
  1. package com.mingrisoft.frame;
  2.  
  3. import java.awt.AWTException;
  4. import java.awt.BorderLayout;
  5. import java.awt.Color;
  6. import java.awt.Dimension;
  7. import java.awt.Graphics;
  8. import java.awt.Image;
  9. import java.awt.Rectangle;
  10. import java.awt.Robot;
  11. import java.awt.Toolkit;
  12. import java.awt.datatransfer.Clipboard;
  13. import java.awt.datatransfer.DataFlavor;
  14. import java.awt.datatransfer.Transferable;
  15. import java.awt.datatransfer.UnsupportedFlavorException;
  16. import java.awt.event.ActionEvent;
  17. import java.awt.event.ActionListener;
  18. import java.awt.event.MouseAdapter;
  19. import java.awt.event.MouseEvent;
  20. import java.awt.event.MouseMotionAdapter;
  21. import java.awt.image.BufferedImage;
  22. import java.awt.image.RescaleOp;
  23. import java.io.File;
  24. import java.io.IOException;
  25. import java.text.SimpleDateFormat;
  26. import java.util.Date;
  27.  
  28. import javax.imageio.ImageIO;
  29. import javax.swing.Icon;
  30. import javax.swing.ImageIcon;
  31. import javax.swing.JButton;
  32. import javax.swing.JFileChooser;
  33. import javax.swing.JOptionPane;
  34. import javax.swing.JPanel;
  35. import javax.swing.JToolBar;
  36. import javax.swing.JWindow;
  37. import javax.swing.filechooser.FileNameExtensionFilter;
  38. import javax.swing.filechooser.FileSystemView;
  39.  
  40. import com.mingrisoft.EQ;
  41.  
  42. /**
  43.  * 截图工具类 此类本身是一个JWindow窗体,窗体会覆盖整个屏幕,覆盖之前会捕获当期桌面的影响图片,但所有的操作其实是在此窗体上的。
  44.  *
  45.  */
  46. public class CaptureScreenUtil extends JWindow {
  47.         private int startX, startY;// 鼠标定位的开始坐标
  48.         private int endX, endy;// 鼠标定位的结束坐标
  49.         private BufferedImage screenImage = null;// 桌面全屏图片
  50.         private BufferedImage tempImage = null;// 修改后成暗灰色的全屏图片
  51.         private BufferedImage saveImage = null;// 截图
  52.         private ToolsWindow toolWindow = null;// 工具栏窗体
  53.         private Toolkit tool = null;// 组件工具包
  54.  
  55.         public CaptureScreenUtil() {
  56.                 tool = Toolkit.getDefaultToolkit();// 创建系统该默认组件工具包
  57.                 Dimension d = tool.getScreenSize();// 获取屏幕尺寸,赋给一个二维坐标对象
  58.                 setBounds(0, 0, d.width, d.height);// 设置截图窗口坐标和大小
  59.  
  60.                 Robot robot;// 创建Java自动化测试类
  61.                 try {
  62.                         robot = new Robot();
  63.                         Rectangle fanwei = new Rectangle(0, 0, d.width, d.height);// 创建区域范围类
  64.                         screenImage = robot.createScreenCapture(fanwei);// 捕捉此区域所有像素所生成的图像
  65.                         addAction();// 添加动作监听
  66.                         setVisible(true);// 窗体可见
  67.                 } catch (AWTException e) {
  68.                         e.printStackTrace();
  69.                         JOptionPane.showMessageDialog(null, "截图功能无法使用", "错误",
  70.                                         JOptionPane.ERROR_MESSAGE);
  71.                 }
  72.         }
  73.  
  74.         /**
  75.          * 添加动作监听
  76.          */
  77.         private void addAction() {
  78.                 // 截图窗体添加鼠标事件监听
  79.                 addMouseListener(new MouseAdapter() {
  80.                         @Override
  81.                         public void mousePressed(MouseEvent e) {// 鼠标按下时
  82.                                 startX = e.getX();// 记录此时鼠标横坐标
  83.                                 startY = e.getY();// 记录此时鼠标纵坐标
  84.  
  85.                                 if (toolWindow != null) {// 如果工具栏窗体对象已存在
  86.                                         toolWindow.setVisible(false);// 让工具栏窗体隐藏
  87.                                 }
  88.                         }
  89.  
  90.                         @Override
  91.                         public void mouseReleased(MouseEvent e) {// 鼠标松开时
  92.                                 if (toolWindow == null) {// 如果工具栏窗体对象是null
  93.                                         toolWindow = new ToolsWindow(e.getX(), e.getY());// 创建新的工具栏窗体
  94.                                 } else {
  95.                                         toolWindow.setLocation(e.getX(), e.getY());// 指定工具栏窗体在屏幕上的位置
  96.                                 }
  97.                                 toolWindow.setVisible(true);// 工具栏窗显示
  98.                                 toolWindow.toFront();// 工具栏窗体置顶
  99.                         }
  100.                 });
  101.                 // 截图窗体添加鼠标拖拽事件监听
  102.                 addMouseMotionListener(new MouseMotionAdapter() {
  103.                         public void mouseDragged(MouseEvent e) {// 当鼠标被按下并拖拽时
  104.                                 // 记录鼠标拖动轨迹
  105.                                 endX = e.getX();// 横坐标
  106.                                 endy = e.getY();// 纵坐标
  107.  
  108.                                 // 临时图像,用于缓冲屏幕区域放置屏幕闪烁
  109.                                 Image backgroundImage = createImage(getWidth(), getHeight());// 创建背景图像
  110.                                 Graphics g = backgroundImage.getGraphics();// 获得背景图像的绘图对象
  111.                                 g.drawImage(tempImage, 0, 0, null);// 在背景中绘制暗灰色的屏幕图片
  112.                                 int x = Math.min(startX, endX);// 在鼠标起始位置和结束位置区一个最小的
  113.                                 int y = Math.min(startY, endy);// 在鼠标起始位置和结束位置区一个最小的
  114.                                 int width = Math.abs(endX - startX) + 1;// 图片最小宽度为1像素
  115.                                 int height = Math.abs(endy - startY) + 1;// 图片最小高度为1像素
  116.                                 g.setColor(Color.BLUE);// 使用蓝色画笔画边框
  117.                                 g.drawRect(x - 1, y - 1, width + 1, height + 1);// 画一个矩形,流出一个像素的距离让边框可以显示
  118.                                 saveImage = screenImage.getSubimage(x, y, width, height);// 截图全屏图片
  119.                                 g.drawImage(saveImage, x, y, null);// 在背景中绘制截取出的图片
  120.                                 getGraphics().drawImage(backgroundImage, 0, 0,
  121.                                                 CaptureScreenUtil.this);// 背景图像
  122.                         }
  123.                 });
  124.         }
  125.  
  126.         /**
  127.          * 绘制组件
  128.          */
  129.         public void paint(Graphics g) {
  130.                 RescaleOp ro = new RescaleOp(0.5f, 0, null);// 创建RescaleOp对象,来更改图片每个颜色的颜色偏差,颜色偏移量为0.5f(暗色)
  131.                 tempImage = ro.filter(screenImage, null);// 将屏幕图片的每个像素进行颜色调整,付给临时的图片对象
  132.                 g.drawImage(tempImage, 0, 0, this);// 重新绘制暗灰色的屏幕图片
  133.         }
  134.  
  135.         /**
  136.          * 将当前截图保存到本地
  137.          */
  138.         public void saveImage() {
  139.                 JFileChooser jfc = new JFileChooser();// 创建文件过滤器
  140.                 jfc.setDialogTitle("保存图片");// 设置文件选择器标题
  141.                 FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG",
  142.                                 "jpg");// 创建文件过滤器,只显示.jpg后缀的图片
  143.                 jfc.setFileFilter(filter);// 文件选择器使用过滤器
  144.                 SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");// 创建日期格式化类
  145.                 String fileName = sdf.format(new Date());// 将当前日期作为文件名
  146.                 FileSystemView view = FileSystemView.getFileSystemView();// 获取系统文件视图类
  147.                 File filePath = view.getHomeDirectory();// 获取桌面路径
  148.                 File saveFile = new File(filePath, fileName + ".jpg");// 创建要被保存的图片文件
  149.                 jfc.setSelectedFile(saveFile);// 将文件选择器的默认选中文件设为saveFile
  150.                 int flag = jfc.showSaveDialog(this);// 在主窗体中弹出文件选择器,获取用户操作码
  151.                 if (flag == JFileChooser.APPROVE_OPTION) {// 如果选中的是保存按钮
  152.                         try {
  153.                                 ImageIO.write(saveImage, "jpg", saveFile);// 生成jpg格式的图片文件
  154.                         } catch (IOException e) {
  155.                                 e.printStackTrace();
  156.                                 JOptionPane.showMessageDialog(this, "文件无法保存!", "错误",
  157.                                                 JOptionPane.ERROR);
  158.                         } finally {
  159.                                 disposeAll();// 销毁所有截图窗体
  160.                         }
  161.                 }
  162.         }
  163.  
  164.         /**
  165.          * 把截图放入剪切板
  166.          */
  167.         private void imagetoClipboard() {
  168.                 // 创建传输接口的对象,使用接口本身创建内部类
  169.                 Transferable trans = new Transferable() {
  170.                         @Override
  171.                         /**
  172.                          * 返回将要被传输的对象的数据特征数组
  173.                          */
  174.                         public DataFlavor[] getTransferDataFlavors() {
  175.                                 return new DataFlavor[] { DataFlavor.imageFlavor };
  176.                         }
  177.  
  178.                         @Override
  179.                         /**
  180.                          * 判断参数传入的特征是否符合我们要求的特征
  181.                          */
  182.                         public boolean isDataFlavorSupported(DataFlavor flavor) {
  183.                                 return DataFlavor.imageFlavor.equals(flavor);// 传入的参数是否具有图片特征
  184.                         }
  185.  
  186.                         @Override
  187.                         /**
  188.                          * 返回将要被传输的对象
  189.                          */
  190.                         public Object getTransferData(DataFlavor flavor)
  191.                                         throws UnsupportedFlavorException, IOException {
  192.                                 if (isDataFlavorSupported(flavor)) {// 如果传入的特征符合图片特征
  193.                                         return saveImage;// 返回截图
  194.                                 }
  195.                                 return null;
  196.                         }
  197.                 };
  198.                 Clipboard clipboard = tool.getSystemClipboard();// 获得系统剪切板对象
  199.                 clipboard.setContents(trans, null);// 将当前截图放入剪切板
  200.         }
  201.  
  202.         /**
  203.          * 工具栏窗体
  204.          */
  205.         private class ToolsWindow extends JWindow {
  206.                 /**
  207.                  * 工具栏窗体构造方法
  208.                  *
  209.                  * @param x
  210.                  *            - 工具栏显示的横坐标
  211.                  * @param y
  212.                  *            - 工具栏显示的横坐标
  213.                  */
  214.                 public ToolsWindow(int x, int y) {
  215.                         setLocation(x, y);// 设定窗体在屏幕中显示的位置
  216.  
  217.                         JPanel mainPanel = new JPanel();// 主容器面板
  218.                         mainPanel.setLayout(new BorderLayout());// 容器使用边界布局
  219.  
  220.                         JToolBar toolBar = new JToolBar();// 工具栏
  221.                         toolBar.setFloatable(false); // 工具栏不可拖动
  222.                         JButton saveButton = new JButton();// 保存按钮
  223.                         Icon saveIcon = new ImageIcon(
  224.                                         EQ.class.getResource("/image/telFrameImage/CaptureScreen/save.png"));
  225.                         saveButton.setIcon(saveIcon);
  226.                         saveButton.addActionListener(new ActionListener() {// 按钮点击事件
  227.                                                 @Override
  228.                                                 public void actionPerformed(ActionEvent e) {
  229.                                                         saveImage();// 保存当前截图
  230.                                                 }
  231.                                         });
  232.                         toolBar.add(saveButton);// 工具栏添加按鈕
  233.  
  234.                         JButton closeButton = new JButton();// 关闭按钮
  235.                         Icon closeIcon = new ImageIcon(
  236.                                         EQ.class.getResource("/image/telFrameImage/CaptureScreen/close.png"));
  237.                         closeButton.setIcon(closeIcon);
  238.                         closeButton.addActionListener(new ActionListener() {// 按钮点击事件
  239.                                                 @Override
  240.                                                 public void actionPerformed(ActionEvent e) {
  241.                                                         disposeAll();// 销毁全部窗体
  242.                                                 }
  243.                                         });
  244.                         toolBar.add(closeButton);
  245.  
  246.                         JButton copyButton = new JButton();// 将图片放入剪切板按钮
  247.                         Icon copyIcon = new ImageIcon(
  248.                                         EQ.class.getResource("/image/telFrameImage/CaptureScreen/copy.png"));
  249.                         copyButton.setIcon(copyIcon);// 载入图标
  250.                         copyButton.addActionListener(new ActionListener() {// 按钮点击事件
  251.                                                 public void actionPerformed(ActionEvent e) {
  252.                                                         imagetoClipboard();// 将当前截图放入剪切板
  253.                                                         disposeAll();// 销毁全部窗体
  254.                                                 }
  255.                                         });
  256.                         toolBar.add(copyButton);// 工具栏添加此按钮
  257.  
  258.                         mainPanel.add(toolBar, BorderLayout.NORTH);// 将工具放在容器南部
  259.                         setContentPane(mainPanel);// 窗体加载主容器面板
  260.                         pack();// 自动调整窗体大小
  261.                         setVisible(true);// 显示窗体
  262.  
  263.                 }
  264.  
  265.         }
  266.  
  267.         /**
  268.          * 销毁所有截图窗体
  269.          */
  270.         public void disposeAll() {
  271.                 toolWindow.dispose();// 销毁工具栏窗体
  272.                 dispose();// 销毁工具类窗体
  273.         }
  274.  
  275.         public static void main(String[] args) {
  276.                 new CaptureScreenUtil();
  277.         }
  278. }
  279.  

回复 "企业QQ"

这儿你可以回复上面这条便签

captcha