Symbolanzeige in der Taskleiste in Java (Windows: Benachrichtigungsbereich / Mac: Menüleiste)

Einführung

In letzter Zeit (in meinem Hobbybereich) schreibe ich häufig viel serverseitigen Code mit dem Java Spring Boot-Framework, aber plötzlich wollte ich ihn durch Anzeigen eines Symbols in der Taskleiste resident machen. In Anbetracht der Verteilung von Apps vom Typ Server an Personen, die nicht mit Informationssystemen in Verbindung stehen, hielt ich es für unfreundlich, eine Konsole wie ein Terminal einzurichten, und ich dachte, es wäre schön, wenn der minimale Vorgang mit dem Symbol in der Taskleiste ausgeführt werden könnte. Ist der Auslöser.

Die in diesem Artikel genannte Taskleiste ist der rote Teil in der Abbildung unten.

システムトレイ

Dies ist der "Benachrichtigungsbereich" in Windows und die "Menüleiste" in Mac. Ich denke, es gibt ähnliche in anderen Betriebssystemen. (Derzeit wird Windows nicht mehr als Taskleiste bezeichnet ...)

Umgebung

Dieses Mal werde ich es mit zwei Betriebssystemen versuchen.

SCHRITT 1: Löschen Sie das Symbol vorerst

In diesem Artikel wird Irasutoya-samas "A" -Zeichenillustration als Beispielsymbol "icon.png " verwendet.

Erstens der Code, der nur ein Symbol ausgibt.

Code

IconDemo.java



import java.awt.AWTException;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;

public class IconDemo {

    public static void main(String[] args) {
        IconDemo app = new IconDemo();
        app.run();
    }

    /**
     *Methode zum Anzeigen eines Symbols in der Taskleiste
     */
    private void run() {
        Image image = Toolkit.getDefaultToolkit().createImage( ClassLoader.getSystemResource("icon.png ") ); //Symbolbild vorbereiten
        TrayIcon icon = new TrayIcon(image, "Sample Java App"); //* 1 Wird als Tray-Symbol generiert
        icon.setImageAutoSize(true); //Größe ändern
        
        try {
			SystemTray.getSystemTray().add(icon); //* 2 Zur Taskleiste hinzugefügt
		} catch (AWTException e) {
			e.printStackTrace();
		}
    }
}

Ausführungsergebnis

実行結果

Es wurde so hinzugefügt. Auf einem Mac wurde das Java-Symbol jedoch auch im Dock angezeigt. Wenn Sie dies nicht beabsichtigen, können Sie es anscheinend vermeiden, indem Sie beim Starten des Programms die folgende Option als VM-Argument hinzufügen.


-Dapple.awt.UIElement=true

Mit anderen Worten, wenn Sie Java verwenden, starten Sie es wie folgt.


java -Dapple.awt.UIElement=true IconDemo

Bewegen Sie den Mauszeiger auch über das Symbol.

ツールチップ

Sie sehen "Beispiel Java App". Dies wird als Toolchip bezeichnet, und der obige Code weist Sie an, die angegebene Zeichenfolge anzuzeigen.

※1 TrayIcon

Die Klasse "TrayIcon" stellt ein Symbol dar, das der Taskleiste hinzugefügt werden kann. Der obige Code akzeptiert zwei Argumente, Sie können jedoch bis zu drei verwenden.


/*
1. Argument:Bild Symbol Bild (erforderlich)
2. Argument:Zeichenfolge wird angezeigt, wenn der Mauszeiger auf das Tooltip-Symbol gesetzt wird (optional)
3. Argument:Popup Popup-Menü (optional) Wird im nachfolgenden SCHRITT verwendet
*/
TrayIcon icon = new TrayIcon(Image image, String tooltip, PopupMenu popup);

※2 SystemTray

Die Klasse "SystemTray" repräsentiert die Taskleiste für jedes Betriebssystem. Verwenden Sie "SystemTray.getSystemTray ()", um die eigentliche Taskleiste abzurufen, und verwenden Sie die Methode "add ()", um ein Taskleistensymbol hinzuzufügen.

Sie können auch die Methode "SystemTray.isSupported ()" wie den folgenden Code verwenden, um festzustellen, ob Java die Taskleiste in der Ausführungsumgebung überhaupt manipulieren kann.

IconDemo.java



import java.awt.SystemTray;

public class IconDemo {

    public static void main(String[] args) {
        IconDemo app = new IconDemo();
        app.check();
    }
    
    /**
    *Überprüfen Sie, ob die Ausführungsumgebung die Taskleiste unterstützt
    */
    private void check() {
        Boolean check = SystemTray.isSupported();
        System.out.println("Support status: " + check);
    }

}

Es scheint jedoch, dass ** die Taskleiste nicht unbedingt nicht verfügbar ist **, wenn dies "falsch" wird. Die Quelle bin ich. Als ich versuchte, dasselbe mit Spring Boot zu tun, bekam ich eine unten beschriebene Headless-Ausnahme und die isSupported () -Methode wurde false. Durch Ergreifen der später beschriebenen Korrekturmaßnahme war es jedoch möglich, sie anzuzeigen, selbst wenn sie "falsch" bleibt.

Wenn eine HeadlessException auftritt

In meinem Fall passierte es, als ich Spring Boot verwendete. Die Ursache ist, dass der Headless-Modus von AWT aktiviert ist. Wenn dies aktiviert ist, sind AWT-bezogene Funktionen selten verfügbar.

Sie kann deaktiviert werden, indem im VM-Argument Folgendes angegeben wird.

-Djava.awt.headless=false

Mit anderen Worten, wenn Sie Java verwenden, starten Sie es wie folgt.


java -Djava.awt.headless=false IconDemo

Wenn Sie Spring Boot verwenden, können Sie es auch deaktivieren, indem Sie die Methode main () wie folgt ändern.


/*****Vor dem Wechsel*****/
public static void main(String[] args) {
	SpringApplication.run(IconDemo.class, args);
}

/*****Nach dem Wechsel*****/
public static void main(String[] args) {
	SpringApplicationBuilder builder = new SpringApplicationBuilder(IconDemo.class);
	builder.headless(false).run(args);		
}

(Ich verstehe jedoch nicht die schädlichen Auswirkungen der Deaktivierung der ursprünglich in Spring Boot usw. aktivierten Funktionen.)

SCHRITT 2: Zeigen Sie das Menü an

Erstellt ein Menü, das angezeigt wird, wenn Sie unter Windows mit der rechten Maustaste auf ein Symbol klicken und wenn Sie auf dem Mac auf das Symbol klicken. Außerdem wird beschrieben, was passiert, wenn Sie auf die einzelnen Menüs klicken. Darüber hinaus unterscheidet sich der Schreibstil geringfügig von STEP1.

Code

IconDemo.java



import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class IconDemo {

    public static void main(String[] args) {
        IconDemo app = new IconDemo();
        app.run();
    }

    /**
     *Methode zum Anzeigen eines Symbols in der Taskleiste
     */
    private void run() {
        SystemTray tray = SystemTray.getSystemTray(); //Holen Sie sich die Taskleiste
        PopupMenu popup = new PopupMenu(); //* 4 Popup-Menü erstellen
        Image image = Toolkit.getDefaultToolkit().createImage( ClassLoader.getSystemResource("icon.png ") ); //Symbolbild vorbereiten
        TrayIcon icon = new TrayIcon(image, "Sample Java App", popup); //* 4 Wird als Tray-Symbol generiert
        icon.setImageAutoSize(true); //Größe ändern

        //* 3 Erstellen Sie den Inhalt des Popup-Menüs
        MenuItem item1 = new MenuItem("Hello");
        item1.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Hello world!!");
            }
        });

        MenuItem item2 = new MenuItem("Exit");
        item2.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                tray.remove(icon);
                // System.exit(0);
            }
        });
        popup.add(item1); // ※4
        popup.add(item2); // ※4
        
        try {
            tray.add(icon); //Zur Taskleiste hinzufügen
		} catch (AWTException e) {
			e.printStackTrace();
		}
    }
}

Ausführungsergebnis

Klicken Sie mit der rechten Maustaste auf das Symbol für Windows und klicken Sie auf es für Mac.

実行結果

Klicken Sie auf "Hallo", um "Hallo Welt !!" auf der Konsole anzuzeigen, und klicken Sie auf "Beenden", um das Programm zu beenden.

※3 MenuItem

Jedes Element im Popup-Menü wird mit der Klasse "MenuItem" erstellt. Geben Sie im Argument des Konstruktors die Zeichenfolge des Anzeigenamens im Menü an.

Außerdem wird die Verarbeitung nach dem Klicken auf das Menü mit der Methode addActionListener () hinzugefügt. Ist dieser Schreibstil jedem bekannt, der GUI-Anwendungen erstellt hat? Das Argument der Methode "addActionListener ()" ist eine Instanz, die die Schnittstelle "ActionListener" implementiert. Der obige Code implementiert es unter Verwendung einer anonymen Klasse. Die "ActionListener" -Schnittstelle muss immer die "actionPerformed (ActionEvent e)" -Methode überschreiben, in der Sie schreiben, was nach dem Klicken auf das Menü passiert.

Im Menü "Beenden" wird der Vorgang zum Beenden des Programms geschrieben. Sie können System.exit (0); verwenden, um das Beenden zu erzwingen, aber es scheint keine gute Idee zu sein, es zu oft zu verwenden. Wenn Sie von diesem Programm sprechen, schreiben Sie einfach "tray.remove (icon);" und entfernen Sie das Tray-Symbol aus der Taskleiste.

※4 PopupMenu

Die Klasse "PopupMenu" repräsentiert ein einzelnes Popup-Menü. Indem Sie dieses Popup-Menü im dritten Argument beim Generieren von "TrayIcon" angeben, können Sie das Menü anzeigen, wenn Sie mit der rechten Maustaste klicken oder auf das Symbol klicken.

Das zuvor erstellte MenuItem kann mit der add () -Methode dieses PopupMenu hinzugefügt werden.

SCHRITT 3: Nachricht anzeigen (Benachrichtigung)

Im obigen STEP2-Code wurde, als ich auf das Menü "Hallo" geklickt habe, "Hallo Welt !!" auf der Konsole angezeigt. Lassen Sie uns jedoch etwas als Meldung in der Taskleiste anstelle der Konsole anzeigen.

Code

Ändern Sie den Inhalt der actionPerformed () -Methode von item1 in STEP2 wie folgt.


import java.awt.TrayIcon.MessageType; //Zum Importieren hinzufügen

/**
*Vor dem Wechsel
*/
@Override
public void actionPerformed(ActionEvent e) {
    System.out.println("Hello world!!");
}

/**
*Nach dem Wechsel
*/
@Override
public void actionPerformed(ActionEvent e) {
    // ※5
    icon.displayMessage("Beispielprogramm", "Hallo Welt! Dies ist eine Beispielnachricht.", MessageType.INFO);
}

Ausführungsergebnis

Klicken Sie auf das Menü "Hallo".

実行結果

Leider wurde es auf dem Mac nicht angezeigt. Im Falle eines Mac wird die Nachricht anscheinend über das Benachrichtigungscenter des Mac angezeigt, aber es scheint keine Möglichkeit zu geben, sie direkt von Java aus zu verwenden. Die Person, die [hier] geantwortet hat (https://stackoverflow.com/questions/11720652/using-10-8-notification-center-in-java), hat die Lösung vorgestellt, sie wurde jedoch noch nicht durchgeführt. Es ist eine Überprüfung.

Zusammenfassung

Ich denke, es ist kein sehr moderner Weg.

Wenn Sie einen besseren Weg kennen, würde ich es begrüßen, wenn Sie es mir sagen könnten.

Die Seite, die ich als Referenz verwendet habe

Recommended Posts

Symbolanzeige in der Taskleiste in Java (Windows: Benachrichtigungsbereich / Mac: Menüleiste)
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Ändern Sie die Java-Codierung in Windows