我正在编写一个使用Java TrayIcon
类的应用程序,但我似乎无法在Windows XP / Vista上显示消息。这是一个已知的问题还是我缺少的东西? (消息在Windows 7上显示)
代码:
public class SysTray {
public static void main(String[] args) throws Exception {
TrayIcon icon = new TrayIcon(getImage());
icon.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Good");
}
});
SystemTray.getSystemTray().add(icon);
icon.displayMessage("Attention", "Please click here",
TrayIcon.MessageType.WARNING);
}
private static Image getImage() throws HeadlessException {
Icon defaultIcon = MetalIconFactory.getTreeHardDriveIcon();
Image img = new BufferedImage(defaultIcon.getIconWidth(),
defaultIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);
defaultIcon.paintIcon(new Panel(), img.getGraphics(), 0, 0);
return img;
}
}
编辑:计算机都使用最新版本的Java
编辑II: 各种计算机上的测试结果:
答案 0 :(得分:1)
看看发生了什么(Java6_022和Java7_21,在两个JDK上测试过)
WinXP - - >
Win8 - - >
来自代码
import java.awt.AWTException;
import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.plaf.metal.MetalIconFactory;
public class SysTray {
public SysTray() {
TrayIcon icon = new TrayIcon(getImage());
icon.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Good");
}
});
try {
SystemTray.getSystemTray().add(icon);
} catch (AWTException ex) {
}
icon.displayMessage("Attn","Click here",TrayIcon.MessageType.WARNING);
}
private Image getImage() throws HeadlessException {
Icon defaultIcon = MetalIconFactory.getTreeHardDriveIcon();
Image img = new BufferedImage(defaultIcon.getIconWidth(),
defaultIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);
defaultIcon.paintIcon(new JPanel(), img.getGraphics(), 0, 0);
return img;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
SysTray sysTray = new SysTray();
}
});
}
}