java项目结构如下:

Demo是模仿程序快照,主要设计两个按钮:保存快照和恢复快照;

保存快照将对象(窗口)序列化保存下来,后面无论做了什么操作,只要点击恢复快照,

就会读取之前保存的序列化的对象。

package demo;

import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea; /**
* 提供保存快照和恢复快照方法的类
* @date 2019年3月11日下午3:58:55
* @version 1.0
*/
class Snapshot{
//快照文件
String snapshotFile = "E:/Snapshot.dat"; //保存快照
public void saveSnapshot(MyFrame myFrame) throws IOException {
FileOutputStream fout = null;
ObjectOutputStream out = null;//对象输出流 try {
fout = new FileOutputStream(snapshotFile);
out = new ObjectOutputStream(fout);//构造对象输出流
out.writeObject(myFrame);//序列化
} catch (FileNotFoundException e) {
System.out.println("建立快照文件失败");
e.printStackTrace();
} catch (IOException e) {
System.out.println("写出发生了I/O异常");
e.printStackTrace();
}finally {
if (out != null) {
out.close();//只关闭处理流
}
}
} public MyFrame loadSnapshot() throws IOException{//读取快照
MyFrame myFrame = null;//存放恢复的窗口
FileInputStream fin = null;
ObjectInputStream in = null;//对象输入流 try {
fin = new FileInputStream(snapshotFile);
in = new ObjectInputStream(fin);//构造对象输入流
myFrame = (MyFrame)in.readObject();//反序列化
} catch (FileNotFoundException e) {
System.out.println("读取快照文件失败");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("找不到相应的类");
e.printStackTrace();
} catch (IOException e) {
System.out.println("读取发生I/O异常");
e.printStackTrace();
}finally {
if (in != null) {
in.close();
}
} return myFrame;
} } //实现Serializable接口的类的对象才能被序列化
class MyFrame extends JFrame implements ActionListener, Serializable{
/** serialVersionUID*/
private static final long serialVersionUID = -8045215058120011473L;
/*更改java默认标题栏图标*/ JButton save = new JButton("保存快照");
JButton Load = new JButton("恢复快照"); JPanel panel = new JPanel(); JTextArea textArea = new JTextArea("初始文字");
JScrollPane scrollPane = new JScrollPane(textArea);
//不序列化此字段
transient Snapshot snapshot = new Snapshot(); //snapshot字段的setter方法
public void setSnapshot(Snapshot snapshot) {
this.snapshot = snapshot;
} public MyFrame() {
initUI();
save.addActionListener(this);
Load.addActionListener(this);
} private void initUI() { // C:\\Users\\Administrator\\Desktop\\sna\\img\\ds.ico
// /img/ds.ico String img_path = "/img/tanke.jpg"; //Image img = ImageIO.read(this.getClass().getResource(img_path));
Image img = (Toolkit.getDefaultToolkit().getImage(this.getClass().getResource(img_path)));
setIconImage(img); setLayout(new BorderLayout());
textArea.setLineWrap(true);
add(scrollPane, BorderLayout.CENTER);
panel.add(save);
panel.add(Load);
add(panel, BorderLayout.SOUTH);
setTitle("程序快照机");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(200,140); } @Override
public void actionPerformed(ActionEvent e) {//当控件被激活时,jvm将传递ActionEvent对象通知 try{
if(e.getSource() == save){
snapshot.saveSnapshot(this);
System.out.println(e);
}else {
//否则单击的是恢复快照的按钮
MyFrame f = snapshot.loadSnapshot();
//此行不可少,因为为序列化MyFrame类的snapshot字段
f.setSnapshot(new Snapshot());
f.setVisible(true);//显示恢复原来的窗口
this.dispose();//关闭原来的窗口
}
}catch (Exception e1) {
System.out.println("保存快照时发生I/O错误");
} } } public class SnapshotDemo { public static void main(String[] args) {
MyFrame demo = new MyFrame();
demo.setVisible(true); } }
右键项目进行导包成jar文件,资源文件不导。如图所示

  

  下一步

  

  下一步

  

  我们在test项目底下创建MAINFEST.MF文件,文件内容如下:

  

Manifest-Version: 1.0
Main-Class: snapshot.SnapshotDemo
Class-Path:
Created-By: your name

  其中class-Path我们可不指定,因为在后面的exe4j中会设置到

  选择好后界面如下:

点击finish后就可以在输出目录看到jar文件,这时我们还需将资源文件(如:img)拷到该目录,由于exe4j支持jdk_win32,我们只要拷走jdk中的jre文件。

视图如下:

其中exe4j依赖低版本的jdk1.6。在这里我将exe4j、jdk1.6_32、jdk1.7_32、innoSetup文件放在:

百度网盘:

链接:https://pan.baidu.com/s/1Tizt5qOh8JLDHo3RzVdwrA
提取码:w1cz

下面开始使用exe4j将jar和资源文件打包成exe程序:

下一步

下一步

下一步

设置好后界面如下:

下一步

下面我们来指定jre的位置,由于我把jre拷到跟jar同层目录,如下所示:

下面的一直默认下一步,程序运行效果图:

此时我们可以将jre和jar删除,因为已经打包在demo.exe中了


下面我们开始用InnoSteup来编译windows桌面安装程序:

下一步

下一步

下一步

下一步

下一步

下一步

下一步

然后下一步下面都点是,最后它会要让你选择一个位置保存编译文件,必须选。

大功告成

看效果图:

安装后目录:

参考:

用exe4j+Inno_setup打包java桌面应用

https://blog.csdn.net/yege2006/article/details/51312989

一键搞定Java桌面应用安装部署 —— exe4j + Inno Setup 带着JRE, 8M起飞

https://blog.csdn.net/ouyangxin95/article/details/53009173

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序的更多相关文章

  1. JAVA项目打包成可运行的exe程序

    前言:本篇文章为原创,转载请注明地址,谢谢. 我们一些时候,可能需要需要把我们完成的java打包,打成jar文件或者exe文件.这时候就请鄙人的这篇文章. 言尽于此,Let‘s go! 一.导出jar ...

  2. Java打包生成exe(使用exe4j和inno setup)

    Java打包生成exe 生成jar 先使用eclipse生成可执行的jar[可执行的jar包含内容更全面,包括指定主类的.mf] Exe4j的使用 一定要可执行jar进行打包. Project typ ...

  3. Inno Setup 编译器操作

    Inno Setup 编译器 1◆ 下载inno ha_innosetup5502_skygz_DownG.com 2◆ 安装 next 3◆ 操作 success 4◆ 测试安装 5◆ 卸载 uni ...

  4. Inno Setup 编译器

    Inno Setup 编辑 Inno Setup用Delphi写成,其官方网站同时也提供源程序免费下载.它虽不能与Installshield这类恐龙级的安装制作软件相比,但也当之无愧算是后起之秀.In ...

  5. java代码打包成jar以及转换为exe

    教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...

  6. Java桌面程序打包成exe可执行文件

    前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...

  7. Java项目打包成exe的详细教程

    Java项目打包成exe的详细教程 把Java项目打包成exe共分为以下两步: 1. 利用Eclipse先把Java项目先打成jar包 2. 利用exe4j工具把jar包转成exe 这里以Java项目 ...

  8. JAVA程序打包成exe文件详细图解

    我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: eclipse ...

  9. Java程序打包成exe可执行文件

    前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...

随机推荐

  1. Python day 04

    Day 04 今日内容 补充 1.解释器/编译器 补充:编译型语言和解释型语言? # 编译型:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行. # 解释型:写完代码交给解释器,解释器会从 ...

  2. Oh-My-Zsh及主题、插件安装与配置

    切换zsh Manjaro linux默认安装了zsh,其他可能需要先安装 cat /etc/shells #查看本地有哪几种shell chsh -s /bin/zsh #切换到zsh 默认终端启动 ...

  3. Java对象、引用、实例

    https://blog.csdn.net/zmx729618/article/details/54093075

  4. Log4j2 设置控制台打印彩色日志

    https://www.baidu.com/s?ie=utf-8&tn=02003390_20_hao_pg&wd=%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%99% ...

  5. Java学习笔记_ 数据库隔离级别和事务传播行为

    转自: https://blog.csdn.net/qq_38545713/article/details/79779265 一:数据库的事物隔离级别与传播行为总结:              很多人 ...

  6. Unable to start Ocelot because either a ReRoute or GlobalConfiguration

    在ASP.Net Core项目APIGateway中添加Ocelot+Consul然后运行时 ,VS2017报如下错 : 内部异常 1: Exception: Unable to start Ocel ...

  7. 【HNOI 2017】大佬

    Problem Description 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语.你作为一个 OIer, ...

  8. 从svn到git开发转变

    前言:目前的公司的开发技术还是处于刀耕火种的年代,react,vue已经火到不行了,可是还在用jQuery一遍遍处理着dom.版本控制用的是svn,这里也不是说svn不好,在windows下svn的“ ...

  9. Asp.net core 学习笔记 Fluent Validation

    之前就有在 .net 时代介绍过了. 这个 dll 也支持 .net core 而且一直有人维护. 对比 data annotation 的 validation, 我越来越觉得这个 fluent 好 ...

  10. 如何解锁亚马逊A9的新算法?

    亚马逊每一次变动总能在跨境圈里掀起一场场风波,最近A9算法的更新更是牵动着不少卖家的心. A9算法是亚马逊运行的内核算法,只要消费者在亚马逊上面搜索了商品,那么他就已经开始使用了A9算法,通过分析每一 ...