| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- package com.leanwo.management;
- import java.awt.AWTEvent;
- import java.awt.AWTException;
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import java.awt.Image;
- import java.awt.SystemTray;
- import java.awt.Toolkit;
- import java.awt.TrayIcon;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.io.IOException;
- import java.net.URL;
- import java.util.List;
- import java.util.Timer;
- import java.util.TimerTask;
- import javax.imageio.ImageIO;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JOptionPane;
- import javax.swing.JToolBar;
- import org.apache.log4j.Logger;
- import com.leanwo.management.model.ApplicationSetting;
- import com.leanwo.management.model.ApplicationSettingCache;
- import com.leanwo.management.service.AutoUpdateService;
- import com.leanwo.management.service.ProcessService;
- import com.leanwo.management.service.ProgramRunResult;
- import com.leanwo.management.util.SpringUtil;
- import com.leanwo.management.widget.SelectEventListener;
- import com.leanwo.management.widget.SelectObject;
- public class MainFrame extends JFrame{
- private static Logger logger = Logger.getLogger(MainFrame.class);
-
- private JButton startMenu = null;
- private JButton stopMenu = null;
- private JButton upgradeMenu = null;
- private JButton editConfigMenu = null;
- private JButton startAllMenu = null;
- private JButton stopAllMenu = null;
-
- private ServerFrame serverFrame = null;
- private ServerLogFrame serverLogFrame = null;
- private TrayIcon trayIcon; // 托盘图标
- private SystemTray systemTray; // 系统托盘
- // 得到显示器屏幕的宽高
- private int width = Toolkit.getDefaultToolkit().getScreenSize().width;
- private int height = Toolkit.getDefaultToolkit().getScreenSize().height;
- // 定义窗体的宽高
- private int windowsWidth = 800;
- private int windowsHeight = 400;
- private ApplicationSettingCache applicationSettingCache = null;
- private List<ApplicationSetting> settings = null;
-
- /** 流程服务 */
- private ProcessService processService = null;
- /** 升级服务 */
- private AutoUpdateService autoUpdateService = null;
- /** 自动启动 */
- private boolean isAutoStart;
-
- public MainFrame(boolean isAutoStart) {
- this.isAutoStart = isAutoStart;
- initData();
- initView();
- initMenuItem();
- }
-
- private void initData() {
- applicationSettingCache = (ApplicationSettingCache) SpringUtil.getSingleBean(ApplicationSettingCache.class);
- settings = applicationSettingCache.getSettings();
- processService = (ProcessService) SpringUtil.getSingleBean(ProcessService.class);
- autoUpdateService = (AutoUpdateService) SpringUtil.getSingleBean(AutoUpdateService.class);
- Thread.currentThread().setName("界面主线程");
- }
-
- private void initView() {
- this.setLayout(new BorderLayout(5,5));
- JToolBar toolbar = new JToolBar();
- toolbar.setFloatable(false);
- toolbar.setBorderPainted(false);
-
- add(toolbar, BorderLayout.NORTH);
-
- startMenu = new JButton("启动");
- toolbar.add(startMenu);
- stopMenu = new JButton("停止");
- toolbar.add(stopMenu);
-
- upgradeMenu = new JButton("更新");
- toolbar.add(upgradeMenu);
- editConfigMenu = new JButton("设置");
- toolbar.add(editConfigMenu);
-
- startAllMenu = new JButton("全部启动");
- toolbar.add(startAllMenu);
-
- stopAllMenu = new JButton("全部关闭");
- toolbar.add(stopAllMenu);
-
- serverFrame = new ServerFrame(settings);
- serverFrame.setPreferredSize(new Dimension(300, 0));
- add(serverFrame, BorderLayout.WEST);
- serverFrame.addStateChangeListener(new SelectEventListener() {
- @Override
- public void onSelect(SelectObject event) {
- int index = event.getIndex();
- refreshMenuStatus(index);
- serverLogFrame.setSelectedIndex(index);
- }
- });
-
- serverLogFrame = new ServerLogFrame(settings);
- add(serverLogFrame, BorderLayout.CENTER);
-
- this.setTitle("Prodog程序管理器");
- // this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设定按关闭时的操作,这里是关闭窗口,如果不设定,就什么也不会发生
-
- // 设置图标
- URL path = MainFrame.class.getResource("prodog_16.png");
- Image image;
- try {
- image = ImageIO.read(path);
- this.setIconImage(image);
- } catch (IOException e) {
- logger.error("读取图片异常。", e);
- }
-
- // 激活窗口事件
- this.enableEvents(AWTEvent.WINDOW_EVENT_MASK);
-
- // 设置窗体位置和大小
- this.setBounds((width - windowsWidth) / 2, (height - windowsHeight) / 2, windowsWidth, windowsHeight);
-
- if(isAutoStart) {
- processService.autoStart(settings, serverLogFrame);
- }
- }
-
- /**
- * 初始化菜单事件
- */
- private void initMenuItem() {
- startMenu.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- int selectedRow = serverFrame.getSelectedRow();
- if(selectedRow >= 0 && selectedRow < settings.size()) {
- ApplicationSetting setting = settings.get(selectedRow);
- if(setting.getProgramRunResult() != null) {
- JOptionPane.showMessageDialog(null, "程序已经运行", "程序已经运行", JOptionPane.ERROR_MESSAGE);
- return;
- }
-
- try {
- ProgramRunResult programRunResult = processService.startProgram(setting);
- if(programRunResult == null || programRunResult.getProcess() == null) {
- JOptionPane.showMessageDialog(null, "未配置启动文件或启动命令", "配置异常", JOptionPane.ERROR_MESSAGE);
- }else {
- setting.setProgramRunResult(programRunResult);
- serverLogFrame.updateProgramRunResult(selectedRow, programRunResult);
- }
- } catch (IOException e1) {
- JOptionPane.showMessageDialog(null, e1.getMessage(), "程序启动异常", JOptionPane.ERROR_MESSAGE);
- logger.error("启动异常", e1);
- }
- }else {
- JOptionPane.showMessageDialog(null, "请先选择服务器", "请先选择服务器", JOptionPane.ERROR_MESSAGE);
- }
- }
- });
-
- stopMenu.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- int selectedRow = serverFrame.getSelectedRow();
- if(selectedRow >= 0 && selectedRow < settings.size()) {
- ApplicationSetting setting = settings.get(selectedRow);
- try {
- ProgramRunResult programRunResult = setting.getProgramRunResult();
- if(programRunResult != null && programRunResult.getProcess() != null) {
- programRunResult.getProcess().destroyForcibly();
- }
- programRunResult = processService.stopProgram(setting);
- if(programRunResult == null || programRunResult.getProcess() == null) {
- JOptionPane.showMessageDialog(null, setting.getName() +"未配置停止文件", "程序关闭异常", JOptionPane.ERROR_MESSAGE);
- }else {
- setting.setProgramRunResult(null);
- }
- } catch (IOException e1) {
- JOptionPane.showMessageDialog(null, e1.getMessage(), setting.getName() +"程序关闭失败", JOptionPane.ERROR_MESSAGE);
- logger.error(setting.getName() +"程序关闭失败", e1);
- }
- }else {
- JOptionPane.showMessageDialog(null, "请先选择服务器", "请先选择服务器", JOptionPane.ERROR_MESSAGE);
- }
- }
- });
-
- upgradeMenu.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- int selectedRow = serverFrame.getSelectedRow();
- if(selectedRow >= 0 && selectedRow < settings.size()) {
- ApplicationSetting setting = settings.get(selectedRow);
- if(autoUpdateService.canUpdate(setting)) {
- Object[] options = {"确定","取消"};
- int response = JOptionPane.showOptionDialog(null, "如果您确定要升级,请点击\'确定\'按钮,否则点击\'取消\'按钮", "确定是否升级", JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
- if(response==0)
- {
- autoUpdateService.autoUpdate(setting);
- }
- }else {
- JOptionPane.showMessageDialog(null, "在服务器上未找到可更新的程序", "没有可更新的程序", JOptionPane.ERROR_MESSAGE);
- }
- }else {
- JOptionPane.showMessageDialog(null, "请先选择服务器", "请先选择服务器", JOptionPane.ERROR_MESSAGE);
- }
- }
- });
-
- editConfigMenu.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- int selectedRow = serverFrame.getSelectedRow();
- if(selectedRow >= 0 && selectedRow < settings.size()) {
- ApplicationSetting setting = settings.get(selectedRow);
- SettingEditFrame serverSettingJFrame = new SettingEditFrame(setting);
- serverSettingJFrame.setVisible(true);
- }else {
- JOptionPane.showMessageDialog(null, "请先选择服务器", "请先选择服务器", JOptionPane.ERROR_MESSAGE);
- }
- }
- });
-
- // 全部启动
- startAllMenu.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- boolean canAllStart = true;
- if (settings != null && settings.size() > 0) {
- for(int i = 0; i < settings.size(); i ++) {
- final ApplicationSetting setting = settings.get(i);
- if(setting.getProgramRunResult() != null) {
- canAllStart = false;
- break;
- }
- }
- }
-
- if(canAllStart) {
- processService.autoStart(settings, serverLogFrame);
- }else {
- JOptionPane.showMessageDialog(null, "已经有程序启动了,不能全部启动,请手工启动。", "执行失败", JOptionPane.ERROR_MESSAGE);
- }
- }
- });
-
- // 全部关闭
- stopAllMenu.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- if (settings != null && settings.size() > 0) {
- for(int i = 0; i < settings.size(); i ++) {
- final ApplicationSetting setting = settings.get(i);
- try {
- ProgramRunResult programRunResult = setting.getProgramRunResult();
- if(programRunResult != null && programRunResult.getProcess() != null) {
- programRunResult.getProcess().destroyForcibly();
- }
- programRunResult = processService.stopProgram(setting);
- if(programRunResult == null || programRunResult.getProcess() == null) {
- logger.error(setting.getName() + "程序关闭异常,未配置停止文件。");
- }else {
- setting.setProgramRunResult(null);
- }
- } catch (IOException e1) {
- logger.error(setting.getName() +"程序关闭失败", e1);
- }
- }
- }
- }
- });
- }
-
- /**
- * 刷新菜单的状态
- */
- private void refreshMenuStatus(int selectedRow) {
- if(selectedRow >= 0 && selectedRow < settings.size()) {
- ApplicationSetting setting = settings.get(selectedRow);
- if(setting.isOnline()) {
- startMenu.setEnabled(false);
- stopMenu.setEnabled(true);
- upgradeMenu.setEnabled(false);
- editConfigMenu.setEnabled(true);
- }else {
- startMenu.setEnabled(true);
- stopMenu.setEnabled(true);
- upgradeMenu.setEnabled(true);
- editConfigMenu.setEnabled(true);
- }
- }
- }
-
- //重写这个方法
- @Override
- protected void processWindowEvent(WindowEvent e) {
- if (e.getID() == WindowEvent.WINDOW_CLOSING) {
- //setVisible(false);
- // 关闭其他子线程
- for(int i = 0; i < settings.size(); i ++) {
- ApplicationSetting setting = settings.get(i);
- ProgramRunResult programRunResult = setting.getProgramRunResult();
- if(programRunResult != null && programRunResult.getProcess() != null) {
- programRunResult.getProcess().destroyForcibly();
- }
-
- try {
- programRunResult = processService.stopProgram(setting);
- if(programRunResult == null || programRunResult.getProcess() == null) {
- logger.error("关闭程序失败" + setting.getName() +"未配置停止文件。");
- JOptionPane.showMessageDialog(null, "未配置停止文件", "配置异常", JOptionPane.ERROR_MESSAGE);
- }else {
- setting.setProgramRunResult(null);
- }
- } catch (IOException e1) {
- logger.error("关闭程序失败" + setting.getName(), e1);
- setting.setProgramRunResult(null);
- }
- }
-
- Timer timer = new Timer("定时器:延时关闭");
- this.setEnabled(false);
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- timer.cancel();
- System.exit(0);
- }
- }, 2000, 2000);
- return;
- }
- super.processWindowEvent(e); //该语句会执行窗口事件的默认动作(如:隐藏)
- }
-
- /**
- * 初始化系统托盘
- */
- private void initSystemTray() {
- // 判断当前平台是否支持系统托盘
- if(SystemTray.isSupported()) {
- // 获得系统托盘的实例
- systemTray = SystemTray.getSystemTray();
- try {
- URL path = MainFrame.class.getResource("prodog_16.png");
- Image image = ImageIO.read(path);
- trayIcon = new TrayIcon(image);
- trayIcon.displayMessage("通知:", "程序最小化到系统托盘", TrayIcon.MessageType.INFO);
- // 设置托盘的图标
- systemTray.add(trayIcon);
- trayIcon.addMouseListener(new MouseAdapter() {
- public void mouseClicked(MouseEvent e) {
- // 双击托盘窗口再现
- if (e.getClickCount() == 2) {
- boolean visible = isVisible();
- // setExtendedState(Frame.NORMAL);
- setVisible(!visible);
- }
- }
- });
- this.addWindowListener(new WindowAdapter() {
- public void windowIconified(WindowEvent e) {
- // 窗口最小化时
- setVisible(false);
- }
- });
-
- } catch (IOException e1) {
- logger.error("初始化托盘失败", e1);
- } catch (AWTException e2) {
- logger.error("初始化托盘失败", e2);
- }
- }
- }
- }
|