package watermark;
/**
* CaptureScreen.java
*/
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.*;
import javax.swing.*;
import watermark.MainFrame;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;
public class Main extends JFrame implements ActionListener {
private JButton start,cancel;
private JPanel c;
private BufferedImage get;
private JTabbedPane jtp;//一个放置很多份图片
private int index;//一个一直会递增的索引,用于标认图片
private JRadioButton system;//系统界面
/** Creates a new instance of CaptureScreen */
public Main() {
super("截取屏幕");
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//UIManager管理界面的类
}catch(Exception e){
e.printStackTrace();
}
initWindow();
initOther();
}
private void initOther(){
jtp=new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT);//JTabbedPane用于切换图片,显示子项
}
private void initWindow(){
start=new JButton("开始截取");
cancel=new JButton("退出");
start.addActionListener(this);
cancel.addActionListener(this);
JPanel buttonJP=new JPanel();
c=new JPanel(new BorderLayout());
JLabel jl=new JLabel("截取屏幕", JLabel.CENTER);//JLable类作用是用来对齐,居中
jl.setFont(new Font("黑体",Font.BOLD,40));
jl.setForeground(Color.RED);
c.add(jl,BorderLayout.CENTER);//将jl放入主面板中,并居中
buttonJP.add(start);
buttonJP.add(cancel);
buttonJP.setBorder(BorderFactory.createTitledBorder("公共操作区"));
JPanel jp=new JPanel();//放置一个单选按钮的面板
jp.add(system=new JRadioButton("系统界面",true));
system.addActionListener(this);
jp.setBorder(BorderFactory.createTitledBorder("界面风格"));
JPanel all=new JPanel();
all.add(jp);
all.add(buttonJP);
this.getContentPane().add(c,BorderLayout.CENTER);
this.getContentPane().add(all,BorderLayout.SOUTH);
this.setSize(500,400);
this.setLocationRelativeTo(null);//设置窗口相对于组件的位置
this.setVisible(true);//显示窗口
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void updates(){
this.setVisible(true);
if(get!=null){
//如果索引是0,则表示一张图片都没有被加入过,
//则要清除当前的东西,重新把tabpane放进来
if(index==0){
c.removeAll();
c.add(jtp,BorderLayout.CENTER);
}else{//否则的话,直接对tabpane添加面板就可以了
//就什么都不用做了
}
PicPanel pic=new PicPanel(get);
jtp.addTab("图片"+(++index),pic);
jtp.setSelectedComponent(pic);
SwingUtilities.updateComponentTreeUI(c); // 调整LookAndFeel(javax.swing)
}
}
private void doStart(){
try{
this.setVisible(false);//先隐藏窗口
Thread.sleep(500);//睡500毫秒是为了让主窗完全不见
Robot ro=new Robot(); // (通过本地操作)控制鼠标、键盘等实际输入源(java.awt)
//Robot类中有鼠标移动事件
Toolkit tk=Toolkit.getDefaultToolkit(); // AWT组件的抽象父类(java.awt)
//绑定工具包,将不同界面合并到一起
Dimension di=tk.getScreenSize();//Dimension封装长和宽
Rectangle rec=new Rectangle(0,0,di.width,di.height);//坐标类,可以创建一个矩形
BufferedImage bi=ro.createScreenCapture(rec);//访问图像数据缓冲区
JFrame jf=new JFrame();
Temp temp=new Temp(jf,bi,di.width,di.height); // 自定义的Temp类的对象
jf.getContentPane().add(temp,BorderLayout.CENTER);
jf.setUndecorated(true);//使标题一直存在
jf.setSize(di);
jf.setVisible(true);
jf.setAlwaysOnTop(true);
} catch(Exception e){
e.printStackTrace();
}
}
/**
*公用的处理保存图片的方法
*/
public void doSave(BufferedImage get){
try{
if(get==null){
JOptionPane.showMessageDialog(this
, "图片不能为空!!", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
JFileChooser jfc=new JFileChooser(".");
jfc.addChoosableFileFilter(new GIFfilter());
jfc.addChoosableFileFilter(new BMPfilter());
jfc.addChoosableFileFilter(new JPGfilter());
jfc.addChoosableFileFilter(new PNGfilter());
int i=jfc.showSaveDialog(this);//打开保存文件的对话框
if(i==JFileChooser.APPROVE_OPTION){//获得选中的文件对象
File file=jfc.getSelectedFile();//获得选中的文件
String about="PNG";
String ext=file.toString().toLowerCase();
javax.swing.filechooser.FileFilter ff=jfc.getFileFilter();
if(ff instanceof JPGfilter){
if(!ext.endsWith(".jpg")){
String ns=ext+".jpg";
file=new File(ns);
about="JPG";
}
} else if(ff instanceof PNGfilter){
if(!ext.endsWith(".png")){
String ns=ext+".png";
file=new File(ns);
about="PNG";
}
}else if(ff instanceof BMPfilter){
if(!ext.endsWith(".bmp")){
String ns=ext+".bmp";
file=new File(ns);
about="BMP";
}
}else if(ff instanceof GIFfilter){
if(!ext.endsWith(".gif")){
String ns=ext+".gif";
file=new File(ns);
about="GIF";
}
}
if(ImageIO.write(get,about,file)){
JOptionPane.showMessageDialog(this,"保存成功!");
} else
JOptionPane.showMessageDialog(this,"保存失败!");
}
} catch(Exception exe){
exe.printStackTrace();
}
}
/**
*公共的处理把当前的图片加入剪帖板的方法
*/
public void doCopy(final BufferedImage image){
try{
if(get==null){
JOptionPane.showMessageDialog(this
,"图片不能为空!!","错误",JOptionPane.ERROR_MESSAGE);
return;
} // java.awt.datatransfer(接口)
Transferable trans = new Transferable(){ // 内部类
//Transferable接口 不同介质间数据传输
public DataFlavor[] getTransferDataFlavors() {//返回一个DataFlavor数组
return new DataFlavor[] { DataFlavor.imageFlavor };//指定传输数据时的数据格式为图片数据
}
public boolean isDataFlavorSupported(DataFlavor flavor) {//判断当前传输数据的Transferable对象类型是否满足DataFlavor中的格式
return DataFlavor.imageFlavor.equals(flavor);
}
public Object getTransferData(DataFlavor flavor)//返回一个Transferable数据传输对象
throws UnsupportedFlavorException, IOException {
if(isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
}
};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);//将Clipboard作为剪切板工具接口
JOptionPane.showMessageDialog(