/* * $Id: BizReminder.java,v 1.0 2012/02/28 09:47:39 mk Exp $ * * Copyright (c) 2012 Jason * All Rights Reserved. * Confidential and for internal use only. */ package com.bizatworktech.bizessence.in.web.common.rm; import java.awt.AWTException; import java.awt.Image; import java.awt.MenuItem; import java.awt.PopupMenu; 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.net.URL; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; public class BizReminder extends JPanel implements Runnable { /** * */ private static final long serialVersionUID = 1L; private SystemTray sysTray = SystemTray.getSystemTray(); private TrayIcon trayIcon; // 托盘对象 private static BizReminder instance; private boolean isNews = false; // 消息闪动提醒线程标记 private JFrame jf; private JPanel jp; private LinkLabel lb; // 超链接 private Image iconTray; // 托盘图标 private Image iconWin; // 主题窗口图标 private final String ICON_PATH = "com/bizatworktech/bizessence/in/web/common/rm/"; public boolean isOpened = true; // 主线程标记 public static int count = 0; public static String userId = null; public synchronized static BizReminder getInstance() throws Exception { if (instance == null) instance = new BizReminder(); return instance; } private BizReminder(){ try { this.createTray(); } catch (Exception e) { System.out.println("BizReminder() 初始化失败 " + e.getMessage()); e.printStackTrace(); } } private void createTray(){ if (count > 0 && null != userId) { init(); readMs(); } } /** * 初始化 * * @throws Exception */ private void init(){ this.iconTray = new ImageIcon(getRes(ICON_PATH + "BIZlogo02.gif")) .getImage(); this.iconWin = new ImageIcon(getRes(ICON_PATH + "BIZlogo.gif")) .getImage(); this.trayIcon = new TrayIcon(iconTray); PopupMenu popupMenu = new PopupMenu();// 弹出菜单 MenuItem exit = new MenuItem("Exit"); popupMenu.add(exit); exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { sysTray.remove(trayIcon); trayIcon = null; stop();// 停止线程 } }); this.trayIcon.setPopupMenu(popupMenu); jf = new JFrame("温馨提示(" + count + ")"); jp = new JPanel(); lb = new LinkLabel(count, userId); jp.add(lb); jf.setIconImage(iconWin); jf.setContentPane(jp); jf.setExtendedState(JFrame.NORMAL); jf.setVisible(true); jf.setResizable(false); jf.setBounds(Toolkit.getDefaultToolkit().getScreenSize().width - 255, Toolkit.getDefaultToolkit().getScreenSize().height - 135, 250, 100); // 右下角弹出 jf.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) {// 窗口关闭事件 sysTray.remove(trayIcon); trayIcon = null; stop();// 停止线程, 移除托盘图标 } }); // jf.setDefaultCloseOperation(HIDE_ON_CLOSE);// 设置默认关闭隐藏窗口 this.trayIcon.setToolTip("消息盒子(" + count + ")"); try { this.sysTray.add(trayIcon); } catch (AWTException e1) { System.out.println("托盘初始化出现故障:" + e1.getMessage()); e1.printStackTrace(); } // 以上完成托盘初始化 this.setVisible(true); } /** * 查看消息提醒 * * @throws Exception */ private synchronized void readMs(){ this.trayIcon.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { // 鼠标双击 if (count == 0) JOptionPane.showMessageDialog(jf, "没有新的待办事项!", "提示", JOptionPane.INFORMATION_MESSAGE); else { setToolTipText("消息盒子(" + count + ")"); //Title("消息盒子(" + count + ")"); isNews = false;// 消息已经打开 BizReminder.this.lb.setInfo(count, userId); BizReminder.this.jf.setVisible(true); } } } }); } public URL getRes(String str) { return this.getClass().getClassLoader().getResource(str); } /** * 判断线程是否关闭 返回true表示关闭;否则表示打开 * * @return */ public synchronized boolean isClosed() { return isOpened == false ? true : false; } /** * 中断线程 */ public synchronized void stop() { isOpened = false; isNews = false;// 中断子线程 } /** * 启动线程 */ public synchronized void start() { isOpened = true; } @Override public synchronized void run() { while (isOpened) { System.out.println("启动线程......"); if (count > 0) { isNews = true; } if (null == this.trayIcon) { try { createTray(); // 用户已经关闭提醒,需要重新初始化 } catch (Exception e) { System.out.println("托盘对象为空: " + e.getMessage()); } } while (isNews) {// 有新消息 try { System.out.println("有新的消息了,开始提醒......"); if (!jf.isShowing()) BizReminder.this.jf.setVisible(true); wait();// 下一次消息提醒之前,等待用户查看消息,类推 } catch (Exception e1) { e1.printStackTrace(); System.out.println("提醒消息产生异常" + e1.getMessage()); } } if (!isNews) { try {// 没有新的消息或消息已经查看了;System.out.println("消息查看过了,线程重启......"); notifyAll(); } catch (Exception e) { System.out.println("nofifyAll exception: " + e.getMessage()); } } } } /** * Test code * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { BizReminder.count = 1; BizReminder.userId = "张三"; BizReminder.getInstance(); // new Thread(BizReminder.getInstance()).start(); } }
///: Action /* * $Id: ReminderAction.java,v 1.0 2012/02/28 09:47:39 mk Exp $ * * Copyright (c) 2012 Jason * All Rights Reserved. * Confidential and for internal use only. */ package com.bizatworktech.bizessence.in.web.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import com.bizatworktech.bizessence.cm.xc.BEException; import com.bizatworktech.bizessence.in.web.common.action.BaseAction; import com.bizatworktech.bizessence.in.web.common.rm.BizReminder; /** * 登录界面初始化: 主要是取得待办事项数 * * @author mk * @version $Revision: 1.0 $ */ public class ReminderAction extends BaseAction { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, BEException { int count = 0;// 记录用户任务个数 BizReminder biz = null; HttpSession session = request.getSession(); String id = session.getId(); try { count = getStationDelegator(request).getTasksCountByUser(); if (count > 0){ BizReminder.count = count; BizReminder.id = id; } if (null == session.getAttribute("biz")) { biz = BizReminder.getInstance(); session.setAttribute("biz", biz); } else{ biz = (BizReminder) session.getAttribute("biz"); } //System.out.println(biz.isClosed()); if(!biz.isClosed()){ new Thread(biz).start(); }else{ biz.start(); } //response.getWriter().print(count); } catch (Exception e) { System.out.println("BizReminder wrong: " + e.getMessage()); } return null; } } // js function refreshMs(delay){ var xmlHttp = getXmlHttp(); if( null != xmlHttp){ var url = "${pageContext.request.contextPath}/AjaxAction0.do?ID="+Math.random(); xmlHttp.open("GET", url ,true ); xmlHttp.onreadystatechange = function (){ if ( xmlHttp.readyState == 4 ){ if ( xmlHttp.status == 200 ){ document.getElementById('theMsgId').innerHTML= xmlHttp.responseText; } } } xmlHttp.send( null ); } window.setTimeout("refreshMs("+ delay + ")", delay); } refreshMs(5000);
// link /* * $Id: LinkLabel.java,v 1.0 2012/02/28 09:47:39 mk Exp $ * * Copyright (c) 2012 Jason * All Rights Reserved. * Confidential and for internal use only. */ package com.bizatworktech.bizessence.in.web.common.rm; import java.awt.Cursor; import java.awt.Desktop; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JLabel; /* * $Id: LinkLabel.java,v 1.0 2012/02/28 09:47:39 mk Exp $ * * Copyright (c) 2012 SHANGHAI NEWTECH FABRIC PRINTING LTD * All Rights Reserved. * Confidential and for internal use only. */ package com.bizatworktech.bizessence.in.web.common.rm; import java.awt.Cursor; import java.awt.Desktop; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; /** * 实现提醒用户的快捷方式 * * @author mk * */ public class LinkLabel extends JLabel { /** * */ private static final long serialVersionUID = 1L; private int count; private String name; private boolean isSupported; public LinkLabel(int count, String name) { this.count = count; this.name = name; try { this.isSupported = Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE); } catch (Exception e) { this.isSupported = false; System.out.println("该系统不支持"); } if (this.isSupported) { this.setInfo(count, name); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { JOptionPane.showMessageDialog(null, "请到流程管理软件中进行处理!", "流程管理软件", JOptionPane.INFORMATION_MESSAGE); } }); } } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void setInfo(int count, String name) { setText("<html><div style='font-size:10px serif;' color='#0000FF' >" + name + ", 你好!</div><div style='font:10px;margin-top:5px;' color='#0000FF'>您当前有(<font style=color:#FF0000>" + count + "</font>)条待办事项需要处理!</div></html>"); } /** * 测试 * * @param args */ public static void main(String[] args) { JFrame jf = new JFrame("温馨提示(" + 1 + ")"); JPanel jp = new JPanel(); JLabel lb = new LinkLabel(1, "张三"); jp.add(lb); jf.add(jp); jf.setVisible(true); // jf.setSize(300,300); jf.setBounds(Toolkit.getDefaultToolkit().getScreenSize().width - 255, Toolkit.getDefaultToolkit().getScreenSize().height - 135, 250, 100); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }