package captureScreen;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;
/**
* Title:CaptureScreen类<br>
* Description:截取屏幕软件,可以截取屏幕,以bmp,gif,jpg,png的格式保存所截取的屏幕
* Company:泸州职业技术学院06级软件技术3班
* @author 段松
* @version 2007.12.10
*/
public class CaptureScreen extends JFrame implements ActionListener {
/**
* 定义部分
*/
private JButton btn_start;//定义一个“开始”按钮
private JButton btn_cancel;//定义一个“退出”按钮
private JButton btn_save;//定义一个“保存”按钮
private JPanel jpal_capture;//定义一个面板,该面板是用来存放截取的屏幕画面的
private JPanel jpal_button;//定义一个面板,该面板是用来存放用户界面上需要的按钮的
private BufferedImage bufferedImage;//定义一个BufferedImage对象
/**
* 构造方法,初始化图形用户界面
*
*/
public CaptureScreen() {
super("屏幕截取软件——泸职院电信系06软件3班段松设计");
btn_start = new JButton("截取");
btn_cancel = new JButton("退出");
btn_save = new JButton("保存");
btn_save.setEnabled(false);
btn_save.addActionListener(this);
btn_start.addActionListener(this);
btn_cancel.addActionListener(this);
jpal_button = new JPanel();
jpal_capture = new JPanel(new BorderLayout());
JLabel jLabel = new JLabel("截屏区域", JLabel.CENTER);
jLabel.setFont(new Font("黑体", Font.BOLD, 40));
jLabel.setForeground(Color.CYAN);
jpal_capture.add(jLabel, BorderLayout.CENTER);
jpal_button.add(btn_start);
jpal_button.add(btn_save);
jpal_button.add(btn_cancel);
this.getContentPane().add(jpal_capture, BorderLayout.CENTER);
this.getContentPane().add(jpal_button, BorderLayout.SOUTH);
this.setSize(400, 400);
this.setLocationRelativeTo(null);
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
private void updates() {
this.setVisible(true);//让主窗口可见
if (bufferedImage != null) {
btn_save.setEnabled(true);
ImageIcon imageIcon = new ImageIcon(bufferedImage);
JLabel jLabel = new JLabel(imageIcon);
jpal_capture.removeAll();
jpal_capture.add(new JScrollPane(jLabel), BorderLayout.CENTER);
SwingUtilities.updateComponentTreeUI(this);
}
}
private void doStart() {
try {
this.setVisible(false);//开始截取屏幕时让主窗口不可见
Thread.sleep(500);// 睡500毫秒是为了让主窗完全不见
Robot robot = new Robot();//创建一个Robot对象
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension dimension = toolkit.getScreenSize();
Rectangle rect = new Rectangle(0, 0, dimension.width,
dimension.height);
BufferedImage bufferedImage = robot.createScreenCapture(rect);//createScreenCapture方法创建包含从屏幕中读取的像素的图像
JFrame jFrame = new JFrame();//截取屏幕时,把整个屏幕当成一个框架,这里的jFrame就是整个屏幕
Temp temp = new Temp(jFrame, bufferedImage, dimension.width,
dimension.height);
jFrame.getContentPane().add(temp, BorderLayout.CENTER);//jFrame获取内容面板,并在该内容面板中添加自定义类Temp的实例对象,该对象实质是一个面板
jFrame.setUndecorated(true);
jFrame.setSize(dimension);
jFrame.setAlwaysOnTop(true);
jFrame.setVisible(true);
} catch (Exception exe) {
exe.printStackTrace();
}
}
private void doSave() {
try {
JFileChooser jFileChooser = new JFileChooser(".");
jFileChooser.addChoosableFileFilter(new JPGfilter());
jFileChooser.addChoosableFileFilter(new PNGfilter());
jFileChooser.addChoosableFileFilter(new GIFfilter());
jFileChooser.addChoosableFileFilter(new BMPfilter());
int i = jFileChooser.showSaveDialog(this);
if (i == JFileChooser.APPROVE_OPTION) {
File file = jFileChooser.getSelectedFile();
String string_about = "PNG";
String string_ext = file.toString().toLowerCase();
javax.swing.filechooser.FileFilter fileFilter = jFileChooser
.getFileFilter();
if (fileFilter instanceof JPGfilter) {
if (!string_ext.endsWith(".jpg")) {
String string_ns = string_ext + ".jpg";
file = new File(string_ns);
string_about = "JPG";
}
} else if (fileFilter instanceof PNGfilter) {
if (!string_ext.endsWith(".png")) {
String string_ns = string_ext + ".png";
file = new File(string_ns);
string_about = "PNG";
}
} else if (fileFilter instanceof BMPfilter) {
if (!string_ext.endsWith(".bmp")) {
String string_ns = string_ext + ".bmp";
file = new File(string_ns);
string_about = "BMP";
}
} else if (fileFilter instanceof GIFfilter) {
if (!string_ext.endsWith(".gif")) {
String string_ns = string_ext + ".gif";
file = new File(string_ns);
string_about = "GIF";
}
}
if (ImageIO.write(bufferedImage, string_about, file)) {
JOptionPane.showMessageDialog(this, "保存成功!");
} else
JOptionPane.showMessageDialog(this, "保存失败!");
}
} catch (Exception exe) {
exe.printStackTrace();
}
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == btn_start) {
doStart();
} else if (ae.getSource() == btn_cancel) {
System.exit(0);
} else if (ae.getSource() == btn_save) {
doSave();
}
}
/**
* 保存BMP格式的过滤器
* @author 段松
*
*/
private class BMPfilter extends javax.swing.filechooser.FileFilter {
public BMPfilter() {
}
public boolean accept(File file) {
if (file.toString().toLowerCase().endsWith(".bmp")
|| file.isDirectory()) {
return true;
} else
return false;
}
public String getDescription() {
return "*.BMP(BMP图像)";
}
}
/**
* 保存JPG格式的过滤器
* @author 段松
*
*/
private class JPGfilter extends javax.swing.filechooser.FileFilter {
public JPGfilter() {
}
public boolean accept(File file) {
if (file.toString().toLowerCase().endsWith(".jpg")
|| file.toString().toLowerCase().endsWith(".jpeg")
|| file.isDirectory()) {
return true;
} else
return false;
}
public String getDescription() {
return "*.JPG,*.JPEG(JPG,JPEG图像)";
}
}
/**
* 保存GIF格式的过滤器
* @author 段松
*
*/
private class GIFfilter extends javax.swing.filechooser.FileFilter {
public GIFfilter() {
}
public boolean accept(File file) {
if (file.toString().toLowerCase().endsWith(".gif")
|| file.isDirectory()) {
return true;
} else
return false;
}
public String getDescription() {
return "*.GIF(GIF图像)";
}
}
/**
* 保存PNG格式的过滤器
* @author 段松
*
*/
private class PNGfilter extends javax.swing.filechooser.FileFilter {
public boolean accept(File file) {
if (file.toString().toLowerCase().endsWith(".png")
|| file.isDirectory()) {
return true;
} else
return false;
}
public String getDescription() {
return "*.PNG(PNG图像)";
}
}
/** 一个暂时类,用于显示当前的屏幕图像。
*
* @author 段松
*
*/
private class Temp extends JPanel implements MouseListener,
MouseMotionListener {
/**
* 定义部分,定义此类中要用到的变量
*/
private BufferedImage buffered_Image;//定义一个BufferedImage对象
private int width, height;
private int startX, startY, endX, endY, tempX, tempY;//定义整形变量分别表示截取屏幕时的起始,结束,临时的点的x,y坐标
private JFrame jFrame;//定义一个JFrame框架
private Rectangle rect_select = new Rectangle(0, 0, 0, 0);// rect_select表示截屏时选中的区域
private Cursor cursor = new Cursor(Cursor.CROSSHAIR_CURSOR);// 表示一般情况下的鼠标状态
private States states_current = States.DEFAULT;// 表示当前的编辑状态,DEFAULT状态下鼠标的类型是DEFAULT_CURSOR
private Rectangle[] rect;// 表示截取屏幕时八个编辑点的区域
// 下面四个常量,分别表示谁是被选中的那条线上的端点
pu