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 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); } } } }