Изменение стандартного значка java coffee dock на другое - PullRequest
0 голосов
/ 18 мая 2018

Я прочитал много ответов, чтобы изменить значок кофе по умолчанию, показанный на изображении (ОС: MacOS) (например, с использованием JFrame.setIconImage ()), но не смог этого сделать.

Если кто-то былуспешно удалось изменить его.Не могли бы вы дать пошаговое решение о том, как вы могли это сделать, возможно, с объяснением?

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 июня 2018

Это решение работает с Java 10, где com.apple.eawt.Application больше не работает.Для этого не требуется командная строка.

import java.awt.Taskbar;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

Taskbar taskbar=Taskbar.getTaskbar();
BufferedImage image = ImageIO.read(getClass().getResource("/path/icon.png"));
taskbar.setIconImage(image);

Если вы укажете относительный путь к icon.png, он будет включен в файл jar.Значок также появится в диалоговых окнах.

Вы также захотите использовать код для пунктов меню «О программе», «Предпочтения» и «Выход», ранее предоставленных com.apple.eawt.Application, и вы можете найти его на странице Элвина Александра по адресу Java 10: Как реализовать пункты меню «About», «Preferences» и «Quit» в MacOS

0 голосов
/ 18 мая 2018

Итак, я сделал очень быстрый тест, используя ...

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JLabel;
import com.apple.eawt.Application;

public class Test {

    public static void main(String[] args) {
        try {
            Application application = Application.getApplication();
            application.setDockIconImage(ImageIO.read(Test.class.getResource("/javaapplication163/bunny.jpg")));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class TestPane extends JPanel {

        public TestPane() {
            add(new JLabel("Hello"));
        }

    }

}

И он показал ...

Hello Bunny

Аккуратно ... однако, это будет компилироваться и запускаться только на Mac.

«Типичным» решением этой проблемы было бы использование отражения, чтобы попытаться загрузить com.apple.eawt.Application во время выполнения, что-то вроде ...

try {
    Class appClass = Class.forName("com.apple.eawt.Application");
    Class params[] = new Class[]{Image.class};

    Method getApplication = appClass.getMethod("getApplication");
    Object application = getApplication.invoke(appClass);
    Method setDockIconImage = appClass.getMethod("setDockIconImage", params);
    setDockIconImage.invoke(application, ImageIO.read(Test.class.getResource("/javaapplication163/bunny.jpg")));

} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | ClassNotFoundException | IOException ex) {
    ex.printStackTrace();
}

Но это кое-какая ошибкалегкомысленный и грязный, не говоря уже о полной боли в ... поддерживаемом коде.

Итак, я подумал, что могу попробовать использовать параметры командной строки, как показано на Значок док-станции ...

-Xdock:name="Hello bunny" -Xdock:icon=/path/to/bunny.jpg

, который тоже работал.

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

Если бы я должен был сгенерировать пакет приложений для своего проекта, я бы, вероятно, следовал этому, но если бы я просто развертывал Jar, у меня могло бы возникнуть желание использовать один из предыдущих методов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...