模仿QQ的截图软件,运行就可以截图,按Esc退出
在截图的时候线框部分不好处理,会闪烁,大家有什么好的建议可以提出来,谢谢,由于引用的组件比较多,我都用"*"号代替了,大家复制到Eclipse上可以先把这些import删掉,然后按ctrl+shift+o就可以看见所用的组件了import java.awt.*;import java.awt.datatransfer.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;import javax.swing.*;
import javax.swing.filechooser.FileFilter;import com.sun.image.codec.jpeg.*;@SuppressWarnings("serial")
class ImagePanel extends JPanel
{
private BufferedImage image; public ImagePanel(BufferedImage image)
{
this.image = image;
prefSize();
} public void setImage(BufferedImage image)
{
this.image = image;
prefSize();
repaint();
} /**
 * 设置面板大小
 */
private void prefSize()
{
this.setSize(image.getWidth(), image.getHeight());
} @Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
}/**
 * 文件类型
 */
class ImageFilter extends FileFilter
{ public boolean accept(File f)
{
if (f.isDirectory())
{
return true;
} String extension = getExtension(f);
if (extension != null)
{
if (extension.equals("jpeg") || extension.equals("jpg")
|| extension.equals("bmp"))
{
return true;
} else
{
return false;
}
} return false;
} public String getExtension(File f)
{
String ext = null;
String s = f.getName();
int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1)
{
ext = s.substring(i + 1).toLowerCase();
}
return ext;
} public String getDescription()
{
return "图片类型";
}
}@SuppressWarnings("serial")
public class CutScreen extends JFrame
{
private int x, y, w, h;
private BufferedImage bufImage;
private ImagePanel imagePanel;
private Graphics g;
private static Dimension screenDims;
private GraphicsDevice gd = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice();
private JPopupMenu popup = new JPopupMenu();
private JMenuItem[] popupm =
{ new JMenuItem("Copy"), new JMenuItem("Save"), new JMenuItem("Reset"),
new JMenuItem("Exit") };
private JFileChooser fileChooser = new JFileChooser(); public CutScreen()
{ this.setLayout(new BorderLayout());
this.add(buildControls()); // 设置标题
this.setTitle("截图程序");
// 去掉窗口的装饰
this.setUndecorated(true);
// 采用指定的窗口装饰风格
this.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
// 设置全屏
gd.setFullScreenWindow(this);
// 窗体始终靠前
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private JComponent buildControls()
{
// 获取屏幕图像
bufImage = getScreenImage();
imagePanel = new ImagePanel(bufImage); // 注册事件监听
imagePanel.addMouseListener(new MouseAdapter()
{ // 当鼠标按下时
public void mousePressed(MouseEvent e)
{
// 获取按下时的鼠标坐标
x = e.getX();
y = e.getY();
} public void mouseReleased(MouseEvent e)
{
if (SwingUtilities.isLeftMouseButton(e))
{
// 设置截取图像的宽和高
w = Math.abs(x - e.getX());
h = Math.abs(y - e.getY());
if (w > 0 && h > 0)
{
g.drawLine(x, y, e.getX(), y);
g.drawLine(x, y, x, e.getY());
g.drawLine(x, e.getY(), e.getX(), e.getY());
g.drawLine(e.getX(), y, e.getX(), e.getY());
g.dispose();
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
} public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
});
imagePanel.addMouseMotionListener(new MouseMotionListener()
{ // 当鼠标拖动时
public void mouseDragged(MouseEvent e)
{
if (SwingUtilities.isLeftMouseButton(e))
{
g = imagePanel.getGraphics();
g.setColor(Color.blue);
imagePanel.setImage(bufImage); g.drawLine(x, y, e.getX(), y);
g.drawLine(x, y, x, e.getY());
g.drawLine(x, e.getY(), e.getX(), e.getY());
g.drawLine(e.getX(), y, e.getX(), e.getY());
}
} public void mouseMoved(MouseEvent e)
{
} }); popupm[0].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{ // 复制到剪贴板
setClipboardImage(getAreaImage());
System.exit(0);
}
});
popupm[1].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
save();
System.exit(0);
}
});
popupm[2].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
imagePanel.setImage(bufImage);
}
});
popupm[3].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}); this.addKeyListener(new KeyListener()
{
// 按Esc键退出
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
{
System.exit(0);
}
} public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
}); for (int i = 0; i < popupm.length; i++)
{
popup.add(popupm[i]);
} fileChooser.addChoosableFileFilter(new ImageFilter());
fileChooser.removeChoosableFileFilter(fileChooser
.getAcceptAllFileFilter()); return imagePanel;
} /**
 * 获取屏幕图像
 * 
 * @return:返回BufferedImage对象
 */
private BufferedImage getScreenImage()
{
Robot robot;
try
{
robot = new Robot();
} catch (Exception e)
{
throw new RuntimeException("unable to construct Robot");
}
// 获取屏幕尺寸
screenDims = Toolkit.getDefaultToolkit().getScreenSize(); BufferedImage screen = robot.createScreenCapture(new Rectangle(0, 0,
screenDims.width, screenDims.height)); return screen;
} /**
 * 获取截图区域
 * 
 * @return:返回BufferedImage对象
 */
private BufferedImage getAreaImage()
{
return bufImage.getSubimage(x, y, w, h);
} private void save()
{
if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION)
{
save(fileChooser.getSelectedFile());
}
} /**
 * 保存文件
 * 
 * @param file:文件路径
 */
private void save(File file)
{
BufferedOutputStream imageOut;
try
{
imageOut = new BufferedOutputStream(new FileOutputStream(file));
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(imageOut);
encoder.encode(getAreaImage());
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (ImageFormatException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
} /**
 * 复制到剪贴板
 * 
 * @param image:BufferedImage对象
 */
private void setClipboardImage(final BufferedImage image)
{
Transferable trans = new Transferable()
{
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]
{ DataFlavor.imageFlavor };
} public boolean isDataFlavorSupported(DataFlavor flavor)
{
return DataFlavor.imageFlavor.equals(flavor);
} public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
} };
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,
null);
}
public static void main(String[] args)
{ SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new CutScreen();
}
});
}
}