1

我制作了一个 java swing 应用程序,它需要在 Windows 和 Mac OS X 上运行。

当用户点击最小化按钮时,应用程序被最小化,并在系统托盘中创建一个图标,代码如下:

MainScreen.getInstance().setExtendedState(JFrame.ICONIFIED);

trayIcon = new TrayIcon(new ImageIcon(getClass().getResource(
       "/dragonstore/resources/icon.png")).getImage());

trayIcon.setToolTip("DragonStore");
trayIcon.setImageAutoSize(true);
trayIcon.addMouseListener(new MouseAdapter()
{
     @Override
     public void mouseClicked(MouseEvent e)
           {
           MainScreen.getInstance().setVisible(true);

           MainScreen.getInstance().setExtendedState(NORMAL);
           SystemTray.getSystemTray().remove(trayIcon);
           trayIcon=null;
           MainScreen.getInstance().toFront();
           MainScreen.getInstance().getMainPanel().revalidate();
           MainScreen.getInstance().getMainPanel().repaint();
           MainScreen.getInstance().pack();
           MainScreen.getInstance().validate();
           MainScreen.getInstance().repaint();
           System.out.println("Restore");
       }
});
SystemTray.getSystemTray().add(trayIcon);
trayIcon.displayMessage("DragonStore",
        "Click here to maximized window again",TrayIcon.MessageType.INFO);
setVisible(false);

所以上面的代码执行得很好,当用户点击系统托盘图标时,应用程序由trayIconMouse Clicked 函数中的代码恢复。

在 Windows 上一切正常,在任何地方都没有问题。

但是在 Mac OS X 上,当我恢复应用程序时,它会以动画样式显示所有组件,这在 Mac 上是默认设置,但是一旦它在屏幕上完全恢复,窗口就会显示一个空白窗口,就好像框架没有组件一样。

我调查了这个问题,并在 Mac OS X Lion 中发现了帧重绘错误,但我不认为这是这里的问题。

我应该怎么做才能解决这个问题?

我的目标是使最小化的应用程序在任务栏中不可见,并且图标显示在系统托盘通知中,因此用户可以通过单击系统托盘图标来恢复应用程序。

它必须同时在 Windows 和 Mac 上执行。

在此处输入图像描述

谢谢

4

1 回答 1

2
What should I do to solve this?

采用

  1. JFrame#setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);代替MainScreen.getInstance().setExtendedState(JFrame.ICONIFIED);

  2. MainScreen.getInstance().setVisible(true);应该在最后一行(and only one code line)中public void mouseClicked(MouseEvent e),每一行代码都没用,因为JFrame.HIDE_ON_CLOSE只是为了隐藏JFrame

  3. Every thing goes fine on Windows with no problems anywhere.我怀疑...,但为了获得更好的帮助,请尽快发布SSCCE

于 2012-10-10T06:08:46.723 回答