昨天看到留言,于是今天又把一些功能加进进去了
比如,
1,程序可以最小化到系统托盘区
2,程序可以批量保存所有截过的图片
3,修正了以前的一个小BUG,那就是输入保存图片的文件名时,如果没有输入后缀名,将保存正常,如果输入了后缀名,将会保存格式出错
打包文件请
点击这里下载,dist文件夹里面的JAR文件是可以双击执行的
感谢朋友们的建议,谢谢.
/*
* CaptureScreen.java
*
* Created on 2007年8月30日, 下午12:46
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package hadeslee.swing;
/**
*
* @author lbf
*/
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 java.io.*;
import javax.imageio.*;
import java.awt.image.*;
public class CaptureScreen extends JFrame implements ActionListener{
private JButton start,cancel,saveAll;
private JPanel c;
private BufferedImage get;
private JTabbedPane jtp;//一个放置很多份图片
private int index;//一个一直会递增的索引,用于标认图片
private JRadioButton java,system;//JAVA界面,系统界面
/** Creates a new instance of CaptureScreen */
public CaptureScreen() {
super("屏幕截取软件(第三版)");
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exception exe){
exe.printStackTrace();
}
initWindow();
initOther();
initTrayIcon();
}
private void initOther(){
jtp=new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT);
}
private void initWindow(){
start=new JButton("开始截取");
saveAll=new JButton("保存所有");
cancel=new JButton("退出");
start.addActionListener(this);
saveAll.addActionListener(this);
cancel.addActionListener(this);
JPanel buttonJP=new JPanel();
c=new JPanel(new BorderLayout());
c.setBackground(Color.BLACK);
JLabel jl=new JLabel("屏幕截取",JLabel.CENTER);
JLabel jl1=new JLabel("<Html><Font size=5 color=white>作者:千里冰封<br>" +
"QQ:24325142<br><br><br></Font></html>",JLabel.CENTER);
jl.setFont(new Font("黑体",Font.BOLD,40));
jl.setForeground(Color.RED);
jl1.setForeground(Color.BLUE);
c.add(jl,BorderLayout.CENTER);
c.add(jl1,BorderLayout.SOUTH);
buttonJP.add(start);
buttonJP.add(saveAll);
buttonJP.add(cancel);
buttonJP.setBorder(BorderFactory.createTitledBorder("公共操作区"));
JPanel jp=new JPanel();//放两个单选按钮的面板
jp.add(java=new JRadioButton("java界面"));
jp.add(system=new JRadioButton("系统界面",true));
java.addActionListener(this);
system.addActionListener(this);
jp.setBorder(BorderFactory.createTitledBorder("界面风格"));
ButtonGroup bg=new ButtonGroup();
bg.add(java);
bg.add(system);
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.setAlwaysOnTop(true);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
CaptureScreen.this.setVisible(false);
}
});
}
private void initTrayIcon(){
try{
SystemTray st=SystemTray.getSystemTray();
Image im=ImageIO.read(this.getClass().getResource("bg.gif"));
PopupMenu pm=new PopupMenu("弹出菜单");
pm.add(new MenuItem("关于")).addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
JOptionPane.showMessageDialog(CaptureScreen.this,"<html><Font color=red><center><h2>关于</h2></center></Font>" +
"这是一款纯JAVA的屏幕截取程序<br>在以前的基础上增加了一些常用的功能,<br>" +
"比如,批量保存,多幅截取,复制到系统粘帖板<br>" +
"在使用过程中有任何问题,欢迎联系.<br>" +
"<Font size=5 color=blue>作者:千里冰封<br>" +
"<i>QQ:24325142</i><br></Font></html>");
}
});
pm.addSeparator();
pm.add(new MenuItem("显示主窗口")).addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
CaptureScreen.this.setVisible(true);
}
});
pm.add(new MenuItem("开始截取")).addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
doStart();
}
});
pm.add(new MenuItem("退出程序")).addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
System.exit(0);
}
});
TrayIcon ti=new TrayIcon(im,"JAVA屏幕截取",pm);
st.add(ti);
ti.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
CaptureScreen.this.setVisible(true);
}
});
}catch(Exception exe){
exe.printStackTrace();
}
}
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);
}
}
private void doStart(){
try{
this.setVisible(false);
Thread.sleep(500);//睡500毫秒是为了让主窗完全不见
Robot ro=new Robot();
Toolkit tk=Toolkit.getDefaultToolkit();
Dimension di=tk.getScreenSize();
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);
jf.getContentPane().add(temp,BorderLayout.CENTER);
jf.setUndecorated(true);
jf.setSize(di);
jf.setVisible(true);
jf.setAlwaysOnTop(true);
} catch(Exception exe){
exe.printStackTrace();
}
}
/**
*公共方法,处理保存所有的图片
*/
public void doSaveAll(){
if(jtp.getTabCount()==0){
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){
about="JPG";
} else if(ff instanceof PNGfilter){
about="PNG";
}else if(ff instanceof BMPfilter){
about="BMP";
}else if(ff instanceof GIFfilter){
about="GIF";
}
if(ext.endsWith(about.toLowerCase())){
ext=ext.substring(0,ext.lastIndexOf(about.toLowerCase()));
}
//起一个线程去保存这些图片并显示出进度条
new SaveAllThread(ext,about).setVisible(true);
}
}
//专门用来保存所有图片的线程类,它还要显示出保存的进度条
private class SaveAllThread extends JDialog implements Runnable{
private String name;//文件名头部份
private String ext;//文件格式
private JProgressBar jpb;//一个进度条
private JLabel info;// 一个信息显示条
private int allTask,doneTask;//所有任务,已完成任务
public SaveAllThread(String name,String ext){
super(CaptureScreen.this,"保存",true);
this.name=name;
this.ext=ext;
initWindow();
}
private void initWindow(){
jpb=new JProgressBar();
allTask=jtp.getTabCount();
jpb.setMaximum(allTask);
jpb.setMinimum(0);
jpb.setValue(0);
jpb.setStringPainted(true);
setProgressBarString();
info=new JLabel("正在保存到:");
this.getContentPane().setBackground(Color.CYAN);
this.add(info,BorderLayout.NORTH);
this.add(jpb,BorderLayout.SOUTH);
this.setUndecorated(true);
this.setSize(300,100);
this.setLocationRelativeTo(CaptureScreen.this);
new Thread(this).start();
}
private void setProgressBarString(){
jpb.setString(""+doneTask+"/"+allTask);
}
public void run(){
try{
for(int i=0;i<allTask;i++){
PicPanel pp=(PicPanel)jtp.getComponentAt(i);
BufferedImage image=pp.getImage();
File f= new File(name+(doneTask+1)+"."+ext.toLowerCase());
info.setText("<html><b>正在保存到:</b><br>"+f.toString()+"</html>");
ImageIO.write(image,ext,f);
doneTask++;
jpb.setValue(doneTask);
setProgressBarString();
Thread.sleep(500);
}
JOptionPane.showMessageDialog(this,"保存完毕!!");
this.dispose();
}catch(Exception exe){
exe.printStackTrace();
this.dispose();
}
}
}
/**
*公用的处理保存图片的方法
*这个方法不再私有了
*/
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){
about="JPG";
if(!ext.endsWith(".jpg")){
String ns=ext+".jpg";
file=new File(ns);
}
} else if(ff instanceof PNGfilter){
about="PNG";
if(!ext.endsWith(".png")){
String ns=ext+".png";
file=new File(ns);
}
}else if(ff instanceof BMPfilter){
about="BMP";
if(!ext.endsWith(".bmp")){
String ns=ext+".bmp";
file=new File(ns);
&n
分享到:
相关推荐
第四部分:心得体会 - **学习体会**:分享在项目开发过程中的收获和感悟。 - **改进建议**:提出项目中存在的不足之处及改进建议。 - **未来展望**:对个人或项目未来发展方向的看法。 #### 三、编写建议 - **...
Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...
在本资源中,我们主要探讨的是JSP(JavaServer Pages)程序设计技术,特别是通过一个实际项目的第四章实训来深入理解这一技术。JSP是一种基于Java的服务器端脚本语言,用于生成动态网页内容。本教程的核心是通过实践...
本实验报告是针对大学生JAVA程序设计课程的,基于吕凤翥第二版教材,旨在通过实际操作加深对JAVA语言的理解,特别是GUI(图形用户界面)菜单设计方面的能力培养。实验的主要目标是让学生掌握菜单设计、弹出菜单设计...
- Java SE (Standard Edition) 是用于开发桌面应用程序的标准版 Java 平台。 - 选择正确的 Java 版本对于后续的开发工作至关重要。 3. **关键知识点**: - **Java SE**: 主要用于开发桌面应用,包含了基本的 ...
3. 时间安排上,你需要在第6周的星期四(4月3日)提交报告。这意味着你需要提前规划好时间,确保有足够的时间完成实验、调试代码和撰写报告。 在撰写报告时,可以按照以下结构进行: - 引言:简单介绍实验的目标和...
#### 三十一、Java大学教程(JavaHowtoProgram)(第四版)中文版 这本书详细介绍了Java编程的基本概念和技术,适合大学阶段的Java课程教学。 #### 三十二、Java+Eclipse实战视频教程第一集 这份教程通过10集的视频...
- **丁振凡**,《Java语言实用教程实验指导(第2版)》[M],北京邮电大学出版社,2008.1 - **杨树林等**,《Java语言最新实用案例教程(第2版)》[M],清华大学出版社,2010.7 #### 七、课程设计进度安排 1. **准备阶段...
5. 如果设计题目来源于《Java课程设计案例精编(第二版)》,则需要在此基础上增加1-2项新功能。 课程设计报告应包含以下部分: 1. 封面 2. 目录 3. 系统描述:介绍系统的功能和解决的问题 4. 分析与设计:功能模块...
- **第四步:** 在`WEB-INF`目录下新建`web.xml`文件。该文件用于定义Web应用的基本配置信息。文件的内容如下: ```xml <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi=...
在本节中,我们将深入探讨如何从零开始搭建SpringCloud项目,并通过源码分析和相关截图来理解这一过程。SpringCloud作为一个微服务框架,提供了一系列工具和服务,帮助开发者快速构建分布式系统。它包括服务发现、...
实验结果以截图的形式展示,可以直观地看到输入表达式经过语义分析后的四元式序列,从而验证程序的正确性。 在“src”目录下,包含了实验的主要源代码,这些代码实现了递归下降分析器的各种函数,对应于文法的不同...
#### 八、第一个Java程序:HelloWorld ```java class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } ``` 1. **程序结构**: - 定义类:`class HelloWorld`...
《Java2实用教程(第三版)》北京清华大学出版社2006.8 - [2] 朱福喜.《Java语言程序设计》.北京清华大学出版社.2005 - [3] 朱福喜,尹为民,余振坤.《Java语言与面向对象程序设计》.武汉武汉大学出版社.2002 ...
词法分析是编译器的第一个阶段,它的任务是识别源代码中的关键字、标识符、常量、运算符等基本元素。在这个实验中,词法分析器可能通过扫描输入的字符流,根据预定义的正则表达式来识别不同的标记。每个识别出的标记...
2. 正确导入项目后我们来看下包结构:分为Dao、model、view、util四个顶层包,采用的是mvc的设计模式。 3. 第二部需要导入数据库,我们用的是navicat数据库管理软件,非常好用,建议大家也使用这个。 4. 首先先新建...
《JSP实用教程案例及素材》是一本专为学习Java Server Pages(JSP)技术而设计的实践指导书籍。该书以丰富的实例为载体,帮助读者深入理解和掌握JSP的基本概念、语法特性以及在实际开发中的应用。通过本书,读者可以...
这款Java swing实现的学生信息管理系统和jsp版本的功能很相似,简单的实现了班级信息的增删改查,学生信息的增删改查,数据库采用的是mysql,jdk版本不限,是Java学习者学习参考非常好的一个小项目,下面我们来看看...
Java语言程序设计(第2版)[M].北京:清华大学出版社,2010 期刊 [2] 石振国. 用JSP实现对Web数据库的访问[J]. 计算机应用,2010(05):5-8. 二、课程设计说明书(或报告书)正文的书写格式简介 1. 正文标题层次 正文题...