用Robot类,来连续截取屏幕图片,并通过JLabel连续加载图片,来实现一个视频录制的功能。
StartCapture.java类是主类,用来实现录制桌面图片的功能,以下是代码
package CountDown;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JToolBar;
import javax.swing.JWindow;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import Util.FrameUtils;
import Util.UI;
public class StartCapture {
JFrame frame = null;
int WIDTH = 580;
int HEIGHT = 290;
JLabel titleLabel = null;
JLabel timeLabel = null;
JLabel currentTime = null;
JWindow openFrame = null;
JMenuBar bar = null;
JMenu menu = null;
JMenu menu2 = null;
JMenu menu3 = null;
JPanel panel = null;
InnerTask it = new InnerTask();
boolean isRecord = false; //视频是否正在录制
Point startPoint = null;
Point endPoint = null;
JPanel windowPanel = null;
JPanel panelRight = null;
JToolBar stateBar = null;
//++++++++++++++++++++++++++++++++++
JList videoList = null;
DefaultListModel listModel = null;
JScrollPane scrollPane = null;
//++++++++++++++++++++++++++++++++++
public void initList(){
listModel.clear();
List list = CapUtils.getCaptureFolder();
int length = list.size();
//++++++++++++++++++++++++++++++++++++++
for(int i=0;i<length;i++){
listModel.addElement(" "+list.get(i));
}
}
public StartCapture() {
panelRight = new JPanel();
listModel = new DefaultListModel();
initList();
videoList = new JList(listModel);
videoList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
videoList.setSelectedIndex(0);
videoList.setVisibleRowCount(5);
videoList.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
// if(e.getClickCount() == 2 && e.getButton() == 1){
// String list = (String) listModel.get(videoList.getSelectedIndex());
// new ShowCapture(CapUtils.URL+list.trim());
// }
if(e.getButton() == 3){
int index = videoList.locationToIndex(e.getPoint());
videoList.setSelectedIndex(index);
JPopupMenu menu = new JPopupMenu("dddddd");
JMenuItem item1 = new JMenuItem("播放");
JMenuItem item3 = new JMenuItem("删除");
menu.add(item1);
menu.add(new JSeparator(SwingConstants.HORIZONTAL));
menu.add(item3);
menu.show(videoList, e.getX(), e.getY());
item1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(listModel.getSize() !=0){
String list = (String) listModel.get(videoList.getSelectedIndex());
new ShowCapture(CapUtils.URL+list.trim());
}
}
});
item3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(listModel.getSize() !=0){
int isDelete = JOptionPane.showConfirmDialog(frame, "是否删除录制的视频?", "删除", JOptionPane.YES_NO_OPTION);
if(isDelete == 0){
String list = (String) listModel.get(videoList.getSelectedIndex());
File file = new File(CapUtils.URL+list.trim());
File[] files = file.listFiles();
for(int i = 0;i<files.length;i++){
files[i].delete();
}
file.delete();
listModel.remove(videoList.getSelectedIndex());
}
}
}
});
}
}
});
scrollPane = new JScrollPane(videoList);
scrollPane.setPreferredSize(new Dimension(200,200));
panelRight.add(scrollPane);
//+++++++++++++++++++++++++++++++++++++++
panel = new JPanel(new BorderLayout());
frame = new JFrame("QNM录制");
frame.setLayout(new BorderLayout());
Font font = new Font("",Font.ITALIC,32);
timeLabel = new JLabel();
timeLabel.setFont(font);
Font font2 = new Font("",Font.LAYOUT_RIGHT_TO_LEFT,32);
titleLabel = new JLabel(" 距离本月发饷:");
titleLabel.setFont(font2);
Font font3 = new Font("",Font.PLAIN,32);
currentTime = new JLabel("",JLabel.RIGHT);
currentTime.setFont(font3);
bar = new JMenuBar();
menu = new JMenu("文件");
menu2 = new JMenu("录制");
menu3 = new JMenu("播放");
bar.add(menu);
bar.add(menu2);
bar.add(menu3);
JMenuItem item1 = new JMenuItem("打开目录");
JMenuItem item2 = new JMenuItem("开始录制");
JMenuItem item3 = new JMenuItem("停止录制");
JMenuItem item4 = new JMenuItem("播放录制");
menu.add(item1);
menu2.add(item2);
menu3.add(item4);
menu2.add(new JSeparator(SwingConstants.HORIZONTAL));
menu2.add(item3);
stateBar = new JToolBar();
stateBar.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
stateBar.setEnabled(false);
stateBar.add(new JLabel(" 欢迎使用QNM系统"));
frame.getContentPane().add(stateBar, BorderLayout.SOUTH);
frame.getContentPane().add(bar, BorderLayout.NORTH);
panel.add(currentTime, BorderLayout.SOUTH);
panel.add(titleLabel, BorderLayout.NORTH);
panel.add(timeLabel, BorderLayout.CENTER);
// panel.add(currentTime);
// panel.add(titleLabel);
// panel.add(timeLabel);
frame.add(panel,BorderLayout.CENTER);
frame.add(panelRight,BorderLayout.WEST);
frame.setBounds(FrameUtils.getSysLocation(WIDTH, HEIGHT));
//frame.setUndecorated(true);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
//frame.setResizable(false);
panel.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton() == 3){
JOptionPane.showMessageDialog(frame, "QNM系列");
}
}
});
item2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
it.startCapture();
}
});
item3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
it.stopCapture();
}
});
item1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String cmd = "cmd /c start "+CapUtils.URL;
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return;
}
});
item4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(listModel.getSize() !=0){
String list = (String) listModel.get(videoList.getSelectedIndex());
new ShowCapture(CapUtils.URL+list.trim());
}else{
JOptionPane.showMessageDialog(frame, "未选中任何文件");
}
}
});
Timer timer = new Timer();
TimerTask task = new TimerTask(){
@Override
public void run() {
Calendar cal = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
if(cal.get(Calendar.DATE)>=15){
cal2.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, 15, 0, 0, 0);
}else{
cal2.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 15, 0, 0, 0);
}
long saveTime = cal2.getTimeInMillis() - cal.getTimeInMillis();
long second = saveTime/1000;
long minute = second/60;
long hour = minute/60;
long day = hour/24;
long saveHour = (hour%24);
long saveMinute = minute%60;
long saveSecond = second%60;
String saveStr = " "+day+"天"+saveHour+"小时"+saveMinute+"分钟"+saveSecond+"秒";
cal.setTimeInMillis(System.currentTimeMillis());
String time = cal.get(Calendar.YEAR) + "-"
+ (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DATE)
+ " " + cal.get(Calendar.HOUR_OF_DAY)+":" +cal.get(Calendar.MINUTE)+":" +cal.get(Calendar.SECOND);
timeLabel.setText(saveStr);
currentTime.setText(time+" ");
}
};
timer.schedule(task, 0, 500);
}
/**
* 内部任务,用来展开视频录制的开始与停止的。
* @author Administrator
*
*/
class InnerTask{
Timer captureDeskTopTimer = null;
TimerTask captureDeskTopTask = null;
File folderFile = null;
public void startCapture(){
if(!isRecord){
folderFile = new File(CapUtils.URL+System.currentTimeMillis());
System.out.println(folderFile.getPath());
if(!folderFile.isDirectory()){
folderFile.mkdir();
}
System.out.println("正在录制");
captureDeskTopTimer = new Timer();
captureDeskTopTask = new TimerTask(){
@Override
public void run() {
try {
Robot ro = new Robot();
BufferedImage bdi = ro.createScreenCapture(new Rectangle((int)FrameUtils.getScreenWidth(),(int)FrameUtils.getScreenHeight()));
ImageIO.write(bdi, "jpg", new File(folderFile.getPath()+"\\"+System.currentTimeMillis()+".jpg"));
} catch (AWTException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
captureDeskTopTimer.schedule(captureDeskTopTask, 0, 40);
isRecord = true;
}
}
public void stopCapture(){
if(isRecord){
captureDeskTopTimer.cancel();
isRecord = false;
String newName = JOptionPane.showInputDialog(frame,"是否重命名录制的视频,为空则默认","重命名",JOptionPane.YES_NO_CANCEL_OPTION);
if("".equals(newName)|| newName == null || "null".equals(newName)){
listModel.addElement(" "+folderFile.getName());
videoList.setSelectedValue(" "+folderFile.getName(), true);
}else{
File newFile = new File(CapUtils.URL+newName);
folderFile.renameTo(newFile);
listModel.addElement(" "+newName);
videoList.setSelectedValue(" "+newName, true);
}
}
}
}
public static void main(String[] args) {
UI.setWindowStyle();
new StartCapture();
}
}
ShowCapture.java类,实现视频图片的播放
package CountDown;
import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import Util.FrameUtils;
import com.sun.awt.AWTUtilities;
public class ShowCapture {
JFrame frame = null;
int WIDTH = 500;
int HEIGHT = 500;
JLabel label = null;
public ShowCapture(final String url) {
frame = new JFrame();
label = new JLabel();
final Timer timer = new Timer();
TimerTask task = new TimerTask(){
File file = new File(url);
File[] files = file.listFiles();
final int size = files.length;
int index = 0;
@Override
public void run() {
if(index < size-1){
label.setText("");
Image image = Toolkit.getDefaultToolkit().getImage(files[index].getPath());
ImageIcon icon = new ImageIcon();
image = image.getScaledInstance((int)FrameUtils.getScreenWidth(),(int)FrameUtils.getScreenHeight(), Image.SCALE_FAST);
icon.setImage(image);
label.setIcon(icon);
index++;
}else{
timer.cancel();
frame.getContentPane().setBackground(Color.BLACK);
AWTUtilities.setWindowOpacity(frame, 0.5f);
frame.remove(label);
JOptionPane.showMessageDialog(frame, " 播放完毕!");
frame.dispose();
}
}
};
timer.schedule(task, 1000, 200);
frame.setUndecorated(true);
frame.add(label);
frame.setBounds(0,0,(int)FrameUtils.getScreenWidth(),(int)FrameUtils.getScreenHeight());
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
frame.setResizable(false);
Toolkit toolkit = Toolkit.getDefaultToolkit();
toolkit.addAWTEventListener(new AWTEventListener(){
public void eventDispatched(AWTEvent event) {
if(event.getClass()== KeyEvent.class){
KeyEvent e = (KeyEvent) event;
int key = e.getKeyCode();
if(key == 27){
timer.cancel();
frame.dispose();
}
}
}
}, 1000);
}
public static void main(String[] args) {
new ShowCapture("");
}
}
还有两个工具类FrameUtils.java和UI.java
package Util;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.Random;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class FrameUtils {
static Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
static Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(
GraphicsEnvironment.getLocalGraphicsEnvironment()
.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration());
/**
* 获得整个屏幕的宽度
*
* @return
*/
public static double getScreenWidth() {
return screen.getWidth();
}
/**
* 获得整个屏幕的高度
*
* @return
*/
public static double getScreenHeight() {
return screen.getHeight();
}
/**
* 获得程序在屏幕中间的位置
*
* @param WIDTH
* 程序的宽度
* @param HEIGHT
* 程序的高度
* @return Rectangle
*/
public static Rectangle getSysLocation(int WIDTH, int HEIGHT) {
Rectangle rectangle = new Rectangle();
rectangle.setLocation((int) (getScreenWidth() - WIDTH) / 2,
(int) (getScreenHeight() - HEIGHT) / 2);
rectangle.setSize(WIDTH, HEIGHT);
return rectangle;
}
/**
* 获得程序在屏幕右下角的位置
*
* @param WIDTH
* 程序的宽度
* @param HEIGHT
* 程序的高度
* @return Rectangle
*/
public static Rectangle getRDLocation(int WIDTH, int HEIGHT) {
Rectangle rectangle = new Rectangle();
rectangle.setLocation((int) (getScreenWidth() - WIDTH),
(int) (getScreenHeight() - HEIGHT - insets.bottom));
rectangle.setSize(WIDTH, HEIGHT);
return rectangle;
}
public static void confirm(Frame frame) {
JDialog dialog = new JDialog(frame, true);
dialog.setBackground(Color.white);
int width = 100;
int height = 100;
dialog.setBounds((int) (getScreenWidth() - width) / 2,
(int) (getScreenHeight() - height) / 2, width, height);
dialog.setTitle("ffffffff");
dialog.setVisible(true);
}
static Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();
/**
* 向系统粘贴板中写入字符串
*
* @param temp
* 要写入的字符串
*/
public static void storeClipString(String temp) {
StringSelection stringSelection = new StringSelection(temp);
sysClip.setContents(stringSelection, null);
}
/**
* 读取系统粘贴板中的字符串
*
* @return
*/
public static String readClipString() {
String temp = "";
try {
temp = (String) sysClip.getData(DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return temp;
}
public static void shakeWindow(JFrame frame){
Rectangle currentRect = new Rectangle();
currentRect.setLocation(frame.getLocation());
currentRect.setSize(frame.getSize());
for (int i = 0; i < 5; i++) {
Random random = new Random();
int raint = (int) (random.nextFloat() * 10);
int newPointX = currentRect.getLocation().x + raint;
int newPointY = currentRect.getLocation().y + raint;
;
frame.setBounds(newPointX, newPointY, currentRect.getSize().width, currentRect.getSize().height);
frame.setVisible(true);
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
public static void main(String[] args) {
}
}
package Util;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class UI {
public static void setWindowStyle() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
public static void setOtherStyle() {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
}
package CountDown;
import java.util.ArrayList;
import java.util.List;
public class CapUtils {
public static String URL = "/";
public static List getCaptureFolder(){
List list = new ArrayList();
return list;
}
}