Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
SystemTray: Programm sol im Hintergrund weiter laufen
Hallo,
bei Klick auf den Schließen oder Minimieren Button, soll mein Programm nicht geschlossen werden sondern weiterhin im Hintergrund laufen.
Es gibt z.B. die Klassen SystemTray und TrayIcon aber ich weiß trotzdem nicht genau, wie ich das programmieren soll.
Die Klasse TrayIcon hat schon fertigen Code aber ich verstehe nicht alles darin.
Wozu ist z.B. der Code für das PopUpMenu da bzw. was macht der Code?
Brauche ich den gesamten Code?
Brauche ich irgendwelche Listener?
Das ist unabhängig von SystemTray s. Sollte man aber generell nicht machen, weil der User in der Annahme ist, das Programm sei geschlossen, wenn er "das Fester" schließt.
Eine einfache Möglichkeit: Dem SystemTray ein TrayIcon hinzufügen, dem TrayIcon einen ActionListener hinzufügen und den ActionListener so programmieren, dass er dein Programm wieder sichtbar macht.
@programmierer123: Mit dem ActionListener machst du denselben Fehler, den @sascha-sphw schon für das Icon beschrieben hat.
Ausserdem: Wer soll denn das Fenster schliessen, damit der entsprechende Code überhaupt zur Ausführung kommt?
Das kannst du machen wie du willst. Entweder nimmst du den, den du schon hast oder du programmierst für jedes Objekt einen eigenen. Du kannst ja nachsehen, welche addXxxxxListener-Methoden die jeweiligen Objekte anbieten, um herauszufinden, was für Listener untzerstützt werden.
Es wurde soweit programmiert aber eine Sache fehlt noch.
Beim Klick auf das Icon soll die Software ein/ausgeblendet werden. Im Moment passiert das nur bei einem Doppelklick.
Ich finde aber einfach nicht heraus, wo der Fehler liegt.
Könnt ihr mir weiterhelfen?
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;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.SwingUtilities;
import org.omg.CORBA.PRIVATE_MEMBER;
public class TrayIconFeature {
TerminSoftware terminsoftware;
public TrayIconFeature(TerminSoftware terminSoftware) {
this.terminsoftware = terminSoftware;
{
TrayIcon trayIcon = null;
if (!SystemTray.isSupported()) {
// TODO Meldung ausgeben, bevor Programm beendet wird
System.exit(-1);
}
Image imageIcon = Toolkit.getDefaultToolkit().getImage("res/appdefault.png");
SystemTray tray = SystemTray.getSystemTray();
PopupMenu popup = new PopupMenu();
MenuItem anzeigen = new MenuItem(Konstanten.PROGRAMMNAME + " anzeigen");
MenuItem ausblenden = new MenuItem(Konstanten.PROGRAMMNAME + " ausblenden");
MenuItem beenden = new MenuItem(Konstanten.PROGRAMMNAME + " beenden");
popup.add(anzeigen);
popup.add(ausblenden);
popup.addSeparator();
popup.add(beenden);
trayIcon = new TrayIcon(imageIcon, "TerminSoftware", popup);
try {
tray.add(trayIcon);
} catch (AWTException e) {
e.printStackTrace();
}
class windowListener extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
popup.remove(ausblenden);
popup.insert(anzeigen,0);
}
@Override
public void windowOpened(WindowEvent e) {
popup.remove(anzeigen);
popup.insert(ausblenden,0);
}
@Override
public void windowDeiconified(WindowEvent e) {
popup.remove(anzeigen);
popup.insert(ausblenden,0);
}
@Override
public void windowIconified(WindowEvent e) {
popup.remove(ausblenden);
popup.insert(anzeigen,0);
}
}
terminSoftware.addWindowListener(new windowListener());
class iconListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
if(terminSoftware.isVisible()) {
terminSoftware.setVisible(false);
}
else {
terminSoftware.setVisible(true);
}
}
}
trayIcon.addActionListener(new iconListener());
class anzeigenListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
terminSoftware.setVisible(true);
}
}
anzeigen.addActionListener(new anzeigenListener());
class ausblendenListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
terminSoftware.setVisible(false);
}
}
ausblenden.addActionListener(new ausblendenListener());
class closeProgram implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
}
beenden.addActionListener(new closeProgram());
}
}
}
Ein TrayIcon löst bei einem einfachen Klick eben kein ActionEvent aus, also kann man es dafür nicht verwenden. Ich habe es aber nur unter Windows ausprobiert. Unter anderen Betriebssystemen (oder anderen Desktop-Umgebungen) mag das vielleicht anders sein.
Also bei mir wird nur das TrayIcon nicht angezeigt bzw. das Bild dazu.
Aber ein Klick auf das Unsichtbare Icon ruft das Menü auf und führt die Aktion dementsprechend durch.
Z. B Beendet die Anwendung.
Ja, bei mir funktioniert es auch. Rechtsklick ruft das Menü auf, Linksklick blendet die Anwendung wechselweise ein oder aus. Die kontextabhängige Anpassung der MenuItems ist aber noch fehlerhaft.
Das wird daran liegen, dass du das Fenster nicht geschlossen sondern minimiert hast (den Fall hatte ich nicht getestet). Über das TrayIcon schaltest du also nur die Sichtbarkeit des minimierten Fensters um. Das müsstest du eigentlich in der Taskleiste sehen können.
Entweder das oder du sorgst beim Minimieren dafür, dass das Fenster unsichtbar wird. Du mußt dir eben überlegen, wie dein Programm sich verhalten soll und dann setVisible()/isVisible() und setExtendedState()/getExtendedState() entsprechend einsetzen.
Siehe voriger Absatz. Der Status des Frames ist übrigens eine Bitmaske. Da würde ich deshalb darauf achten, nur das gewünschte Bit zu setzen bzw. abzufragen oder den vorigen Status zu speichern und später wieder herzustellen. Z.B. soll das Fenster ja wahrscheinlich wieder maximiert werden, falls es vor dem Schliessen oder Minimieren maximiert war.