使用什么技术将systray前端编写到webapp?

时间:2009-06-16 18:44:17

标签: java flex swing spring

我们有一个在tomcat上运行的内部web应用程序,基于Spring构建。 Web应用程序前端是使用Flex构建的 我想创建一个跨平台的系统托盘应用程序,它允许进入应用程序的主页,并在服务器中发生某些事情时显示警报。

您认为最佳技术是什么:

  • 系统托盘本身? Java Swing?
  • 服务器和系统之间的通信?网络服务? RSS订阅? Spring remoting? JMX通知?

的问候,

维姆

4 个答案:

答案 0 :(得分:3)

如果您想继续使用Java,您有两种选择:

  • 使用Swing / AWT。确保您使用的是Java 6及更高版本(您可以将其与您的应用程序一起安装),因为它支持系统托盘(来自API):

    TrayIcon trayIcon = null;
    if (SystemTray.isSupported()) {
        // get the SystemTray instance
        SystemTray tray = SystemTray.getSystemTray();
        // load an image
        Image image = Toolkit.getDefaultToolkit.getImage("");
        // create a action listener to listen for default action executed on
        // the tray icon
        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // execute default action of the application
                // ...
            }
        };
        // create a popup menu
        PopupMenu popup = new PopupMenu();
        // create menu item for the default action
        MenuItem defaultItem = new MenuItem("");
        defaultItem.addActionListener(listener);
        popup.add(defaultItem);
        // / ... add other items
        // construct a TrayIcon
        trayIcon = new TrayIcon(image, "Tray Demo", popup);
        // set the TrayIcon properties
        trayIcon.addActionListener(listener);
        // ...
        // add the tray image
        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.err.println(e);
        }
        // ...
    } else {
        // disable tray option in your application or
        // perform other actions
        // ...
    }
    // ...
    // some time later
    // the application state has changed - update the image
    if (trayIcon != null) {
        trayIcon.setImage(updatedImage);
    }
    // ...
    
  • 使用SWT / JFace。以下是一个示例(摘自here):

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        Image image = new Image(display, 16, 16);
        final Tray tray = display.getSystemTray();
        if (tray == null) {
            System.out.println("The system tray is not available");
        } else {
            final TrayItem item = new TrayItem(tray, SWT.NONE);
            item.setToolTipText("SWT TrayItem");
            item.addListener(SWT.Show, new Listener() {
                public void handleEvent(Event event) {
                    System.out.println("show");
                }
            });
            item.addListener(SWT.Hide, new Listener() {
                public void handleEvent(Event event) {
                    System.out.println("hide");
                }
            });
            item.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    System.out.println("selection");
                }
            });
            item.addListener(SWT.DefaultSelection, new Listener() {
                public void handleEvent(Event event) {
                    System.out.println("default selection");
                }
            });
            final Menu menu = new Menu(shell, SWT.POP_UP);
            for (int i = 0; i < 8; i++) {
                MenuItem mi = new MenuItem(menu, SWT.PUSH);
                mi.setText("Item" + i);
                mi.addListener(SWT.Selection, new Listener() {
                    public void handleEvent(Event event) {
                        System.out.println("selection " + event.widget);
                    }
                });
                if (i == 0)
                    menu.setDefaultItem(mi);
            }
            item.addListener(SWT.MenuDetect, new Listener() {
                public void handleEvent(Event event) {
                    menu.setVisible(true);
                }
            });
            item.setImage(image);
        }
        shell.setBounds(50, 50, 300, 200);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        image.dispose();
        display.dispose();
    }
    

答案 1 :(得分:1)

使用Adobe AIR和BlazeDS或LCDS,您可以轻松构建此类应用程序。

答案 2 :(得分:0)

我会选择FreePascal。它本身编译为windows / mac / linux,因此你不依赖于任何其他框架(.net,java,air)来安装。只需一个可执行文件就可以了。

答案 3 :(得分:0)

我同意James:如果您在Flex中有投资和专业知识,那么使用Air扩展它是有意义的。

至于有效载荷 - 如果您只是需要不时“弹出”通知,RSS就是要走的路。否则,请使用类似XML REST的服务,因为它易于设置,从长远来看可以为您提供灵活性。