首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

自各儿写的屏幕截图软件,大家一起学习

2011-12-06 
自己写的屏幕截图软件,大家一起学习模仿QQ的截图软件,运行就可以截图,按Esc退出在截图的时候线框部分不好

自己写的屏幕截图软件,大家一起学习
模仿QQ的截图软件,运行就可以截图,按Esc退出
在截图的时候线框部分不好处理,会闪烁,大家有什么好的建议可以提出来,谢谢,由于引用的组件比较多,我都用"*"号代替了,大家复制到Eclipse上可以先把这些import删掉,然后按ctrl+shift+o就可以看见所用的组件了

Java code
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();
}
});
}
}



[解决办法]
mark
[解决办法]
不错,但是使用了一些sun专用的API,不建议这样做!
[解决办法]
探讨
不错,但是使用了一些sun专用的API,不建议这样做!

[解决办法]
前排占座
[解决办法]
收藏了,明天在看!
[解决办法]
顶一下,弄点分
[解决办法]
拿来学习了!
[解决办法]

[解决办法]
不错,先收藏了
[解决办法]
java搞成这样不错了
[解决办法]
顶一下

[解决办法]
要好好学习一下
[解决办法]
其实,最重要的还是靠jdk6中的Robot类
[解决办法]
支持
[解决办法]
值得我学习
[解决办法]
mark

[解决办法]
太长了,看的有点乱。 学习下。
[解决办法]
学习
[解决办法]
顶一下!
------解决方案--------------------


牛人

热点排行