我制作了一个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);
因此上面的代码执行正常,当用户单击系统托盘图标时,应用程序将由trayIcon
鼠标单击功能中的代码恢复。
Windows上的每一件事情都很顺利,没有任何问题。
但是在Mac OS X上,当我恢复应用程序时,它会显示动画样式的所有组件,这在Mac上是默认的,但是一旦它在屏幕上完全恢复,窗口就会显示一个空白窗口,就好像框架有没有组件。
我调查了这个问题并在Mac OS X Lion中发现了一个重绘帧错误,但我不认为这是问题所在。
我该怎么做才能解决这个问题?
我的目标是使最小化的应用程序在任务栏中不可见,并且图标显示在系统托盘通知中,因此用户可以通过单击系统托盘图标来恢复应用程序。
必须在Windows和Mac上执行。
由于
答案 0 :(得分:2)
What should I do to solve this?
使用
JFrame#setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
代替MainScreen.getInstance().setExtendedState(JFrame.ICONIFIED);
MainScreen.getInstance().setVisible(true);
应该是and only one code line
中的最后一行(public void mouseClicked(MouseEvent e)
),每个代码行都没用,因为JFrame.HIDE_ON_CLOSE
只隐藏JFrame
,
Every thing goes fine on Windows with no problems anywhere.
我怀疑......,但是为了更好的帮助,请尽快发布SSCCE