Измените имя значка в области уведомлений в Windows на Java

Я создал программу, которая поддерживает уведомления в системном трее. Я установил значок с всплывающей подсказкой и всплывающим сообщением для панели задач. Когда я запускаю программу, значок появляется в значках области уведомлений в Windows, а имя по умолчанию рядом с ним - Java (TM) Platform SE Binary. Могу ли я изменить это имя по умолчанию на другое имя, такое как имя моей программы?


person I.Ruskov    schedule 05.04.2013    source источник
comment
Это описание из файла .exe, который используется для запуска приложения. Самый простой способ получить настраиваемый значок - это иметь настраиваемую программу запуска exe с соответствующим описанием, а не просто вызывать java(w).exe из сценария.   -  person Petesh    schedule 05.04.2013


Ответы (2)


пожалуйста, вызванный этим кодом тоже

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;

public class ActiveTray {

    private SystemTray tray;
    private TrayIcon trayIcon;
    private Icon icon, icon1;
    private Image image, image1;
    private Timer timer;

    public ActiveTray() {
        if (SystemTray.isSupported() == false) {
            System.err.println("No system tray available");
            return;
        }
        tray = SystemTray.getSystemTray();
        PropertyChangeListener propListener = new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                TrayIcon oldTray[] = (TrayIcon[]) evt.getOldValue();
                TrayIcon newTray[] = (TrayIcon[]) evt.getNewValue();
                System.out.println(oldTray.length + " / " + newTray.length);
            }
        };
        tray.addPropertyChangeListener("trayIcons", propListener);
        icon = new BevelArrowIcon(BevelArrowIcon.UP, false, false);
        image = iconToImage(icon);
        icon1 = new BevelArrowIcon(BevelArrowIcon.DOWN, false, false);
        image1 = iconToImage(icon1);
        PopupMenu popup = new PopupMenu();
        MenuItem item = new MenuItem("Hello, World");
        trayIcon = new TrayIcon(image, "Tip Text", popup);
        ActionListener menuActionListener = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                trayIcon.displayMessage("Good-bye", "Cruel World",
                        TrayIcon.MessageType.WARNING);
            }
        };
        item.addActionListener(menuActionListener);
        popup.add(item);
        ActionListener actionListener = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                tray.remove(trayIcon);
            }
        };
        trayIcon.addActionListener(actionListener);
        try {
            tray.add(trayIcon);
            start();
        } catch (AWTException ex) {
            Logger.getLogger(ActiveTray.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    private void start() {
        timer = new javax.swing.Timer(125, updateCol());
        timer.start();
        trayIcon.displayMessage(null, "  Aplication Loaded  ", TrayIcon.MessageType.NONE);
    }

    private Action updateCol() {
        return new AbstractAction("Icon load action") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                Runnable doRun = new Runnable() {

                    @Override
                    public void run() {
                        Image img = trayIcon.getImage();
                        if (img == image) {
                            trayIcon.setImage(image1);
                        } else {
                            trayIcon.setImage(image);
                        }
                    }
                };
                SwingUtilities.invokeLater(doRun);
            }
        };
    }

    public static void main(String args[]) {
        ActiveTray activeTray = new ActiveTray();
    }

    static Image iconToImage(Icon icon) {
        if (icon instanceof ImageIcon) {
            return ((ImageIcon) icon).getImage();
        } else {
            int w = icon.getIconWidth();
            int h = icon.getIconHeight();
            GraphicsEnvironment ge =
                    GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice gd = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc = gd.getDefaultConfiguration();
            BufferedImage image = gc.createCompatibleImage(w, h);
            Graphics2D g = image.createGraphics();
            icon.paintIcon(null, g, 0, 0);
            g.dispose();
            return image;
        }
    }

    static class BevelArrowIcon implements Icon {

        public static final int UP = 0;         // direction
        public static final int DOWN = 1;
        private static final int DEFAULT_SIZE = 16;
        private Color edge1;
        private Color edge2;
        private Color fill;
        private int size;
        private int direction;

        public BevelArrowIcon(int direction, boolean isRaisedView,
                boolean isPressedView) {
            if (isRaisedView) {
                if (isPressedView) {
                    init(UIManager.getColor("controlLtHighlight"),
                            UIManager.getColor("controlDkShadow"),
                            UIManager.getColor("controlShadow"),
                            DEFAULT_SIZE, direction);
                } else {
                    init(UIManager.getColor("controlHighlight"),
                            UIManager.getColor("controlShadow"),
                            UIManager.getColor("control"),
                            DEFAULT_SIZE, direction);
                }
            } else {
                if (isPressedView) {
                    init(UIManager.getColor("controlDkShadow"),
                            UIManager.getColor("controlLtHighlight"),
                            UIManager.getColor("controlShadow"),
                            DEFAULT_SIZE, direction);
                } else {
                    init(UIManager.getColor("controlShadow"),
                            UIManager.getColor("controlHighlight"),
                            UIManager.getColor("control"),
                            DEFAULT_SIZE, direction);
                }
            }
        }

        public BevelArrowIcon(Color edge1, Color edge2, Color fill,
                int size, int direction) {
            init(edge1, edge2, fill, size, direction);
        }

        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            switch (direction) {
                case DOWN:
                    drawDownArrow(g, x, y);
                    break;
                case UP:
                    drawUpArrow(g, x, y);
                    break;
            }
        }

        @Override
        public int getIconWidth() {
            return size;
        }

        @Override
        public int getIconHeight() {
            return size;
        }

        private void init(Color edge1, Color edge2, Color fill,
                int size, int direction) {
            edge1 = Color.red;
            edge2 = Color.blue;
            this.edge1 = edge1;
            this.edge2 = edge2;
            this.fill = fill;
            this.size = size;
            this.direction = direction;
        }

        private void drawDownArrow(Graphics g, int xo, int yo) {
            g.setColor(edge1);
            g.drawLine(xo, yo, xo + size - 1, yo);
            g.drawLine(xo, yo + 1, xo + size - 3, yo + 1);
            g.setColor(edge2);
            g.drawLine(xo + size - 2, yo + 1, xo + size - 1, yo + 1);
            int x = xo + 1;
            int y = yo + 2;
            int dx = size - 6;
            while (y + 1 < yo + size) {
                g.setColor(edge1);
                g.drawLine(x, y, x + 1, y);
                g.drawLine(x, y + 1, x + 1, y + 1);
                if (0 < dx) {
                    g.setColor(fill);
                    g.drawLine(x + 2, y, x + 1 + dx, y);
                    g.drawLine(x + 2, y + 1, x + 1 + dx, y + 1);
                }
                g.setColor(edge2);
                g.drawLine(x + dx + 2, y, x + dx + 3, y);
                g.drawLine(x + dx + 2, y + 1, x + dx + 3, y + 1);
                x += 1;
                y += 2;
                dx -= 2;
            }
            g.setColor(edge1);
            g.drawLine(xo + (size / 2), yo + size - 1, xo
                    + (size / 2), yo + size - 1);
        }

        private void drawUpArrow(Graphics g, int xo, int yo) {
            g.setColor(edge1);
            int x = xo + (size / 2);
            g.drawLine(x, yo, x, yo);
            x--;
            int y = yo + 1;
            int dx = 0;
            while (y + 3 < yo + size) {
                g.setColor(edge1);
                g.drawLine(x, y, x + 1, y);
                g.drawLine(x, y + 1, x + 1, y + 1);
                if (0 < dx) {
                    g.setColor(fill);
                    g.drawLine(x + 2, y, x + 1 + dx, y);
                    g.drawLine(x + 2, y + 1, x + 1 + dx, y + 1);
                }
                g.setColor(edge2);
                g.drawLine(x + dx + 2, y, x + dx + 3, y);
                g.drawLine(x + dx + 2, y + 1, x + dx + 3, y + 1);
                x -= 1;
                y += 2;
                dx += 2;
            }
            g.setColor(edge1);
            g.drawLine(xo, yo + size - 3, xo + 1, yo + size - 3);
            g.setColor(edge2);
            g.drawLine(xo + 2, yo + size - 2, xo + size - 1, yo + size - 2);
            g.drawLine(xo, yo + size - 1, xo + size, yo + size - 1);
        }
    }
}
person mKorbel    schedule 05.04.2013

Сегодня я столкнулся с той же проблемой. Как упомянул Питеш в комментарии, я использовал специальную программу запуска, чтобы решить эту проблему.

Launch4j

Launch4j - это кроссплатформенный инструмент для упаковки приложений Java, распространяемых в виде jar-файлов, в облегченные собственные исполняемые файлы Windows.

Вот шаги, которые я предпринял для его создания:

  1. Basic
    1. Set an output file name
    2. Выберите «Не заворачивать банку, только запускать».
    3. Введите относительный путь к файлу .jar
      (я рекомендую использовать ту же папку и для файлов .exe и .jar)
  2. Путь к классам
    это необходимо, так как мы не будем запускать через javaw.exe или java.exe
    простого перехода к файлу .jar в разделе «Основной класс» должно быть достаточно
    вы должны увидеть, что появится ваш основной класс и список должен быть пустым
  3. Заголовок
    Тип заголовка: JNI GUI (бета), из документации:
    # P4 #
  4. JRE
    1. Enter an appropriate minimum JRE version
    2. Выберите только 32-разрядную версию, заголовки JNI в настоящее время несовместимы с 64-разрядной JRE.
  5. Version Info
    1. Check add version info
    2. Заполните все обязательные поля
      Запись Описание файла отображается в уведомлении Windows.

Теперь все, что осталось сделать, это сохранить конфигурацию и построить. Вы увидите такое предупреждение:

ВНИМАНИЕ! Некоторые функции не реализованы в заголовках JNI, см. Документацию.

Эти ограничения можно найти здесь в разделе ‹headerType›.

Конечно, вы можете использовать совершенно другие параметры, такие как объединенная JRE или объединение .jar внутри файла .exe.

person Mirco Gericke    schedule 14.06.2017