背景:公司有个老项目,web项目,但是使用者都想要一个桌面应用程序。实际上,是web程序的启动较为麻烦。这里每次都需要启动Tomcat和浏览器。

想法:重写一个项目太麻烦,想想成本,人间不值得。于是我想着简化一下整个流程。

要求:界面要美,主要是流畅,看不出来是网页的效果。加载完美。

过程:启动程序时自动打开tomcat+内嵌浏览器自动全屏并加载页面+关闭时自动关闭tomcat(需要手动修改配置把tomcat后台隐藏)

完善:

1.启动和关闭tomcat通过管理员命令来实现

2.通过对tomcat配置隐藏掉tomcat的后台

3.为了更为便捷,增加了设置文件;分别是启动bat脚本、关闭bat脚本、内嵌浏览器启动时加载的主页+程序的标题名称

页面效果大概如下:

首先是后台加载页面(其实就是在等待系统执行打开web服务器的脚本)

贴一下代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;public class DoRun extends JPanel {private static final long serialVersionUID = 1L;private final int DELAY = 50;// 转动快慢设置
//  private final static Long time = (long) 5000;  //窗体关闭事件private static Timer timer; //动画计时器private int x = 0;/*** 调用*/public void start(boolean flag) {JFrame frame = new JFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//本类为Panelframe.add(new DoRun());frame.setSize(300, 300);frame.setLocation(400, 400);// 设置窗体居中显示frame.setLocationRelativeTo(frame.getOwner());//窗体定时关闭/*try {Thread.sleep(time);} catch (InterruptedException e) {}// 停止 Timer,使它停止向其侦听器发送动作事件。timer.stop();frame.setVisible(false);frame.dispose();*/}/*** 面板构造函数,初始化面板。包括Timer 的场景。*/public DoRun() {timer = new Timer(DELAY, new ReboundListener());timer.start();}/*** 动画效果:不断的更新图像的位置,以达到动画的效果。*/private class ReboundListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {if (x < 360) {//控制每个DELAY周期旋转的角度,+ 为逆时针  - 为顺时针x = x - 5;} else {x = 0;}repaint();}}/*** 绘出图像在面板中的位置*/public void paintComponent(Graphics page) {super.paintComponent(page);drawArc(page);}/*** 画图形*/private void drawArc(Graphics g) {Graphics2D g2d = (Graphics2D) g.create();//抗锯齿 //JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/awt/RenderingHints.htmlg2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);int width = getWidth();int height = getHeight();//设置画笔颜色g2d.setColor(Color.BLACK);g2d.drawArc(width / 2 - 110, height / 2 - 110, 10 + 200, 10 + 200, 0, 360);g2d.setColor(Color.GREEN);g2d.fillArc(width / 2 - 110, height / 2 - 110, 10 + 200, 10 + 200, x, 240);g2d.setColor(Color.BLACK);g2d.fillArc(width / 2 - 90, height / 2 - 90, 10 + 160, 10 + 160, 0, 360);g2d.dispose();}
}
package ceims;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;public class FileRead {/*** 读取txt文件的内容* @param file 想要读取的文件对象* @return 返回文件内容*/public String txt2String(File file){StringBuilder result = new StringBuilder();try{BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件String s = null;while((s = br.readLine())!=null){//使用readLine方法,一次读一行result.append(System.lineSeparator()+s);}br.close();    }catch(Exception e){e.printStackTrace();}return result.toString();}//    public static void main(String[] args){
//        File file = new File("C:/3.txt");
//        System.out.println(txt2String(file));
//    }
}
package ceims;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.RoundRectangle2D;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;import javax.swing.*;import com.sun.awt.AWTUtilities;import chrriis.common.UIUtils;
import chrriis.dj.nativeswing.swtimpl.NativeInterface;
import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;/*** swing实现简单的浏览器窗口* * @author WangSong**/
public class SimpleBrowser extends JPanel {/*** */private static final long serialVersionUID = 1L;// 引入窗口、jwebprivate JPanel webBrowserPanel;private JWebBrowser webBrowser;// 构造器传入参数public SimpleBrowser(String url) {super(new BorderLayout());webBrowserPanel = new JPanel(new BorderLayout());webBrowser = new JWebBrowser();webBrowser.navigate(url);// 默认打开的网址webBrowser.setButtonBarVisible(true);// 按钮组webBrowser.setMenuBarVisible(true);// 菜单webBrowser.setBarsVisible(true);// 组件可见webBrowser.setStatusBarVisible(true);// 组件可用webBrowserPanel.add(webBrowser, BorderLayout.CENTER);// 添加浏览器、居中显示add(webBrowserPanel, BorderLayout.CENTER);// Container中添加Panel、居中显示// 执行Js代码
//        webBrowser.executeJavascript("alert('浏览器打开了....')");}/*** 在swing里内嵌浏览器* * @param url   要访问的url* @param title 窗体的标题*/public static void openForm(String url, String title) {UIUtils.setPreferredLookAndFeel();NativeInterface.open();// 新的线程运行浏览器效果SwingUtilities.invokeLater(new Runnable() {public void run() {JFrame frame = new JFrame(title);// 设置窗体关闭的时候不关闭应用程序frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.getContentPane().add(new SimpleBrowser(url), BorderLayout.CENTER);frame.setExtendedState(JFrame.MAXIMIZED_BOTH);frame.setLocationByPlatform(true);// 重置窗体大小frame.setResizable(true);Toolkit kit = Toolkit.getDefaultToolkit();Dimension dimension = kit.getScreenSize();frame.setExtendedState(JFrame.MAXIMIZED_BOTH);frame.setBounds(0, 0, dimension.width, dimension.height);frame.setUndecorated(true);// 让窗体可见frame.setVisible(true);// 设置窗体的宽度、高度//frame.setSize(1400, 700);// 设置窗体居中显示frame.setLocationRelativeTo(frame.getOwner());frame.getGraphicsConfiguration().getDevice() .setFullScreenWindow(frame);frame.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {try {Runtime.getRuntime().exec("c:\\close.bat");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}System.exit(0);}});}});NativeInterface.runEventPump();}// 主程序入口public static void main(String[] args) {JFrame frame = new JFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//本类为Panelframe.add(new DoRun());frame.setSize(300, 300);frame.setLocation(400, 400);frame.setUndecorated(true);/** 设置圆角 */  AWTUtilities.setWindowShape(frame, new RoundRectangle2D.Double(  0.0D, 0.0D, frame.getWidth(), frame.getHeight(), 40.0D,  40.0D));frame.setVisible(true);frame.setOpacity(0.7f);// 设置窗体居中显示frame.setLocationRelativeTo(frame.getOwner());try {             // 运行bat文件Process process = Runtime.getRuntime().exec("c:\\start.bat");InputStream in = process.getInputStream();String line;BufferedReader br = new BufferedReader(new InputStreamReader(in));if ((line = br.readLine()) != null) {System.out.println(line);frame.setVisible(false);frame.dispose();FileRead fr =new FileRead();String url = fr.txt2String(new File("C:\\url.txt"));String title = fr.txt2String(new File("C:\\title.txt"));openForm(url,title);}in.close();// process.waitFor();System.out.println("执行成功");} catch (Exception e) {System.out.println("执行失败");frame.setVisible(false);frame.dispose();JOptionPane.showMessageDialog(null, "初始化失败!", "", JOptionPane.ERROR_MESSAGE);System.exit(0);}}
}

有问题的或者相关思路可以交流一下

Java swing 做一个传统Web项目的桌面程序启动器(内嵌浏览器)相关推荐

  1. JavaWeb项目打包成桌面程序,内嵌浏览器、tomcat、jre、mysql,实现一键安装

    本文介绍的仅是基本的实现逻辑(主程序代码),不包含具体的实现方法,如需全套源码或者定制成品可+V a139412339 @echo off::获取管理员权限 if exist "%Syste ...

  2. java Swing 做一个简单的输入文本框

    java Swing做一个简单的文本输入框, 新建一个SwingDemo类: // //java swing做一个简单的文本框 //Created by lee_1310 on 2019.03.29 ...

  3. [Head First Java] - Swing做一个简单的客户端

    参考 - P487 1. vscode配置java的格式 点击左下角齿轮 -> 设置 -> 打开任意的setting.json输入如下代码 {code-runner.executorMap ...

  4. java中用swing做一个windows计算器

    java中用swing做一个windows计算器 主函数 普通计数器 科学计算器 注意: 前言: 来看这篇教程估计都是java课程设计吧,现在已经没有公司很少使用swing组件了,java主要还是开发 ...

  5. java:用Swing做一个普通计算器

    用Swing做一个普通计算器 用swing做更加复杂的计算器 https://blog.csdn.net/dark_souls/article/details/89672759 由于上一篇文章用的一个 ...

  6. 【java】本地客户端内嵌浏览器3 - Swing 使用 Spring 框架 + 打包项目 + 转exe + 源码

    目录 ★☆★ 写在前面 ★☆★ ★☆★ 本系列文章 ★☆★ ★☆★ 开源网址 ★☆★ 一.给 Swing 加上 Spring 0.前期努力 I. SpringBoot II. SpringMVC 1. ...

  7. java 显示日历 swing_用Java Swing作一个日历控制程序

    日期是最基本的数据形式之一,因此很多语言或者数据库都提供了对日期的支持,或内置或提供这一类的库.Java也不例外:Java的应用编程接口提供了以跨平台立独语言的方式描述,计算,对比,显示以及便携式分析 ...

  8. java swing 创建一个简单的QQ界面

    记录自己用java swing做的第一个简易界面. LoginAction.java package com.QQUI0819;import javax.swing.*; import java.aw ...

  9. 使用vue做一个“淘宝“项目——3

    做出分类页面 前言:做出首页,详细请看前两篇文章 1.使用vue做一个"淘宝"项目(做出首页) 2.使用vue做一个"淘宝"项目(显示商品栏) 目录: 创建项目 ...

最新文章

  1. python subprocess库 终端命令行命令
  2. python画代码-一行Python代码画心型
  3. 脚本语言和编程语言的区别
  4. abap 中modify 的使用
  5. HTTP协议支持的方法
  6. 第7章:图像的平滑处理
  7. H5炫酷特效系列4——炫酷粒子变化特效
  8. python2.7安装pygame_python 安装 pygame了
  9. Hibernate最全面试题
  10. java图的拓扑排序,本周算法:图的拓扑排序,本周算法拓扑排序
  11. UAT,(user acceptance Test),用户接受度测试 标准步骤
  12. python控制51单片机的红绿灯_51单片机控制交通灯_51单片机红绿灯编程
  13. Surface pro3电源管理
  14. 百度收录批量提交入口以及方法
  15. 15个国外最好的电子商务建站程序
  16. java如何删除购物车里的商品_编写一个简易购物车,实现向购物车内添加商品,移除指定商品及清空购物车功能。...
  17. c语言中 if(x) 、if(0) 、if(1)
  18. ios 渐变透明背景_利用PS绘制唯美梦幻多边形背景图
  19. jquery.qrcode 批量打印
  20. 杭电计算机考研复试经验帖

热门文章

  1. vue实现一个具有添加、删除、按关键字过滤的列表管理
  2. 颜色检测传感器模块知识分享
  3. saiku多sort改造
  4. Flutter组件(Padding,Row,Column,Expanded)
  5. 设计模式学习笔记(二十四):策略模式
  6. CDN加速的工作原理是什么?它有什么好处
  7. windows下简易安装ncl
  8. Ettercap安装教程
  9. 大咖论赛——阿里云天池TOP选手不得不说的那些事儿
  10. Oracle INSTR 用法 Oracle 字符串搜索函数 INSTR Oracle instr 函数和like模糊查询对比 Oracle INSTR 用法