# TrayIcon



## Dagobert (6. Dez 2009)

Guten Tag zusammen,

ist es mir möglich bei einem TrayIcon die Anzeigedauer einer Nachricht einzustellen? Ich habe das ganze mal so versucht zu lösen, aber dies ist noch nicht ganz das was ich haben wollte:

```
package GUI;

import java.awt.AWTException;
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.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import Server.DatenbankServer;
import Server.LoginServer;

/**
 * Diese Klasse stellt das TrayIcon Symbol für den Server da.
 * 
 * @author Dagobert
 * @version 1.0
 * @since 06.12.2009
 */
public class ServerTrayIcon implements Runnable {

	private DatenbankServer dbServer;
	private LoginServer loginServer;

	private TrayIcon trayIcon;
	private Image trayImage;

	private Queue<DisplayNachricht> messageQueue;
	
	private boolean exitServer = false;
	/**
	 * Erstellt ein neues ImageIcon, falls das System dies untersctüzt.
	 * @param dbServer
	 */
	public ServerTrayIcon(DatenbankServer dbServer) {
		
		this.dbServer = dbServer;
		
		if (SystemTray.isSupported()) {

			messageQueue = new LinkedList<DisplayNachricht>();

			SystemTray tray = SystemTray.getSystemTray();

			try {
				trayImage = ImageIO.read(new File("src/GUI/tray.png"));
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			// Das Trayiconmenü
			PopupMenu menue = new PopupMenu();

			// Server Start/Stop Menüpunkt
			MenuItem startStop = new MenuItem("Stop Server");
			menue.add(startStop);

			// Einstellungen Menüpunkt
			MenuItem einstellung = new MenuItem("Einstellungen");
			new ServerKonfiguration(dbServer);
			menue.add(einstellung);

			// Beenden Menüpunkt
			ImageIcon iconBeenden = new ImageIcon("src/GUI/tray2.png");
			MenuItem exit = new MenuItem("Beenden");
			exit.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					displayWarning("Beenden", "Der Server wird heruntergefahren", 5);
					exitServer = true;
				}
			});
			menue.add(exit);

			trayIcon = new TrayIcon(trayImage, "Server", menue);

			trayIcon.setImageAutoSize(true);

			try {
				tray.add(trayIcon);
			} catch (AWTException e) {
				e.printStackTrace();
			}

		} else {
			System.out.println("Systemtray is not supported.");
		}
	}
	
	/**
	 * Erstellt eine neue Display Nachricht vom Typ Message für das TrayIcon.
	 * @param titel Titel der Nachricht.
	 * @param message Eigentlichliche Nachricht.
	 * @param show Anzeigedauer der Nachricht.
	 */
	public void displayMessage(String titel, String message, int show) {
		messageQueue.offer(new DisplayNachricht(titel, message, TrayIcon.MessageType.INFO, show));
	}

	/**
	 * Erstellt eine neue Display Nachricht vom Typ Warnung für das TrayIcon.
	 * @param titel Titel der Nachricht.
	 * @param message Eigentlichliche Nachricht.
	 * @param show Anzeigedauer der Nachricht.
	 */
	public void displayWarning(String titel, String message, int show) {
		messageQueue.offer(new DisplayNachricht(titel, message, TrayIcon.MessageType.WARNING, show));
	}

	/**
	 * Erstellt eine neue Display Nachricht vom Typ Error für das TrayIcon.
	 * @param titel Titel der Nachricht.
	 * @param message Eigentlichliche Nachricht.
	 * @param show Anzeigedauer der Nachricht.
	 */
	public void displayError(String titel, String message, int show) {
		messageQueue.offer(new DisplayNachricht(titel, message, TrayIcon.MessageType.ERROR, show));
	}

	/**
	 * Setzt ein neues Bild für das Icon.
	 * @param icon Das neue Bild.
	 */
	public void setTrayIcon(Image icon) {
		trayIcon.setImage(icon);
	}
	/**
	 * Setzt ein neues Bild für das Icon.
	 * @param path Pfad zum Bild.
	 */
	public void setTrayIcon(String path){
		try {
			trayIcon.setImage(ImageIO.read(new File(path)));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void run() {
		while (!exitServer || (exitServer && !messageQueue.isEmpty())) {
			if (!messageQueue.isEmpty()) {
				DisplayNachricht message = messageQueue.poll();
				trayIcon.displayMessage(message.getTitel(), message.getNachricht(), message.getTyp());
				try {
					Thread.sleep(message.getDauer()*1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.exit(0);
	}

	public class DisplayNachricht {
		private String nachricht;
		private String titel;
		private TrayIcon.MessageType typ;
		private int anzeigedauer;

		public DisplayNachricht(String titel, String message, TrayIcon.MessageType typ, int dauer) {
			this.titel = titel;
			this.nachricht = message;
			this.typ = typ;
			this.anzeigedauer = dauer;
		}

		public String getTitel() {
			return this.titel;
		}

		public String getNachricht() {
			return this.nachricht;
		}

		public TrayIcon.MessageType getTyp() {
			return this.typ;
		}
		
		public int getDauer(){
			return this.anzeigedauer;
		}
	}

	public static void main(String[] arg) {
		ServerTrayIcon icon = new ServerTrayIcon(null);
		Thread t = new Thread(icon);
		t.start();

		for (int i = 0; i < 10; i++) {
			icon.displayMessage("Test " + i, "Nachricht " + i , 5);
		}
	}
}
```

Dann habe ich noch eine Frage: Ist es auch möglich ein JPopup Menü mit hineinzubauen, oder bei einem Popup Menü Icons zu verwenden?

mfg. Dagobert


----------



## LovelySacrefice (5. Okt 2010)

Uff fast ein Jahr rum, keiner hat geantwortet zu meinem Bedauern- den ich steh jetzt vor dem selben Problem ^^ Solltest du eine Lösung gefunden haben, schreib mich doch pls kurz an


----------



## weida (20. Nov 2010)

(...na dann antworte ich doch mal. )

Hallo zusammen,

ich habe ein Problem beim Import von java.awt.TrayIcon.
Mir wird die Fehlermeldung "the import conflicts with a type defined in the same file".

Grüße


----------



## LovelySacrefice (18. Feb 2011)

Scheinbar ist TrayIcon wohl ein nicht allzu beliebtes und häufiges Thema... ^^


----------

