没有任务栏图标的JFrame弹出窗口

时间:2013-04-27 15:52:58

标签: java icons jframe highlight taskbar

我创建了从JFrame继承的通知窗口,但它们在Windows任务栏中显示为新图标。是否可以在出现通知时突出显示主应用程序图标(例如在Skype中,当新消息到来时)并且在任务栏中不显示通知窗口中的新图标?

以下是弹出窗口的代码:

public class NotificationWindow extends JFrame
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    static private int m_count = 0;

    public NotificationWindow(String text)
    {
        super("NotificationWindow");
        setLayout(new GridBagLayout());

        setSize(300, 70);
        setLocationRelativeTo(null);

        setOpacity(0.77f);
        setUndecorated(true);
        setResizable(false);

        add(new JLabel(text));

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt)
            {
                --m_count;
            }
        });

        ++m_count;
    }

    static public int GetWindowCount()
    {
        return m_count;
    }

    static public void ShowNotificationWindow(final String text)
    {
        // Determine if the GraphicsDevice supports translucency.
        GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment
                .getLocalGraphicsEnvironment();
        final GraphicsDevice graphicsDevice = graphicsEnvironment
                .getDefaultScreenDevice();

        // If translucent windows aren't supported, exit.
        if (!graphicsDevice.isWindowTranslucencySupported(TRANSLUCENT))
        {
            System.err.println("Translucency is not supported");
            System.exit(0);
        }

        JFrame.setDefaultLookAndFeelDecorated(true);

        // Create the GUI on the event-dispatching thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run()
            {
                NotificationWindow notificationWindow = new NotificationWindow(
                        text);

                Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets(
                        notificationWindow.getGraphicsConfiguration());
                int taskBarSize = scnMax.bottom;
                Rectangle rect = graphicsDevice.getDefaultConfiguration()
                        .getBounds();
                int x = (int) rect.getMaxX() - notificationWindow.getWidth();
                int y = (int) rect.getMaxY() - notificationWindow.getHeight()
                        - taskBarSize - ((m_count - 1) % 7)
                        * notificationWindow.getHeight();
                notificationWindow.setLocation(x, y);
                notificationWindow.setVisible(true);
            }
        });
    }
}

1 个答案:

答案 0 :(得分:5)

不要扩展JFrame,而是扩展JDialog

通常,任何应用程序都应该只有一个JFrame。其他子窗口应该是JDialogs。请参阅:The Use of Multiple JFrames: Good or Bad Practice?