JPopupMenu schließen in SystemTray

Spuddl

Neues Mitglied
Hallo Leute,

Ich brauche für mein MaturaProjekt einen SystemTray und habe diese Lösung gefunden, um JPopupMenu zu verwenden, da PopupMenu einfach schäbig aussieht: Using JPopupMenu in TrayIcon | Java.net

Nur, beim "Wegklicken" bleibt das Menü stehen. Es wird nur geschlossen beim Linksklick auf das Icon oder mit Klick auf ein Item.
Ich habe mich schon damit abgefunden, dieses Problem nicht lösen zu können, da es wahrscheinlich über meine (und vl. auch Javas) Grenzen hinausgeht.

Meine Idee wäre gewesen, einen MouseListener zu machen, bei dem das Menü geschlossen wird, sobald man mit der Mouse vom Icon weggeht (also MouseExited). Ich glaube das ist auch beim JDownloader so, wenn mich nicht alles täuscht.
Nur macht der MouseExited Listener bei mir gar nichts. Es funktioniert Pressed, Released und Clicked, aber Entered und Exited machen nichts.

Ein anderer meiner endlos vielen Lösungsansätze wäre, mouseMoved (der tut nämlich) zu verwenden mit der Abfrage, ob sich die Maus aus dem Tray bewegt hat, nur weiß ich nicht genau, wie ich das realisieren sollte.Bekomme ich von trayIcon XOnScreen? Dann hätte ich nämlich einen Vergleichswert.

Ich würde mich sehr über Hilfe freuen, da ich schon Tage nur an diesem blöden SystemTray verbraten habe und es einfach nicht besser wird =(

Gruß, Spuddl
 

André Uhres

Top Contributor
Hallo Spuddl,

herzlich willkommen bei "java-forum.org".

Ich biete gewöhnlich den folgenden Menüpunkt als letzten Eintrag an: "Dieses Menü verlassen". Damit ist das Problem eindeutig und schlagartig auf sämtlichen Systemen der Welt ein für allemal gelöst :) .

Gruß,
André
 

JavaAtro

Neues Mitglied
Hey Spuddl,
ich hatte das selbe Problem gehabt und habe mich gestern hingesetzt und was zusammengebastelt...
Auf Win XP,7 etc funktioniert alles, auf Linux leider noch nicht getestet :)
Jo dann schaut euch den Quellcode bitte mal an und testet fleißig würde mich freuen wenn ihr mir ein Feedback geben könntet und für Verbesserungsvorschläge bin ich auch immer zu haben ^^

Java:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
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.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;


@SuppressWarnings("serial")
public class Systemtray_JDialog extends JFrame{

	private JDialog jDialog;
	private TrayIcon trayIcon;
	private SystemTray systemTray;
	
	private JLabel openLabel, openLabelIcon;	
	private JLabel messageLabel, messageLabelIcon;	
	private JLabel exitLabel, exitLabelIcon;
	
	private Image image = Toolkit.getDefaultToolkit().getImage(Systemtray_JDialog.class.getResource("icon.png"));
	private ImageIcon icon = new ImageIcon(Systemtray_JDialog.class.getResource("icon.png"));
    private ImageIcon icon2 = new ImageIcon(Systemtray_JDialog.class.getResource("icon2.png"));
	
    private Border border;
    
    //Main
	public static void main(String[] args) throws AWTException {
		
		new Systemtray_JDialog();

	}
	
	//JFrame
	public Systemtray_JDialog() throws AWTException {
		
		super("Systemtray+JDialog");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);		
		
    	trayIcon = new TrayIcon(image, "TrayIcon", null);		
    	
    	//JDialog
		createJDialog();
        
		//TODO JDialog Focuslistener
        jDialog.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent arg0) {
						
				System.out.println("FocusLost");				
				jDialog.setVisible(false);												
				
			}
			
			@Override
			public void focusGained(FocusEvent arg0) {
								
				System.out.println("FocusGained");				
				
			}
			
		});	
    	
    	//TODO Trayicon Mouselistener
    	trayIcon.addMouseListener(new MouseAdapter() {
    		
			public void mouseReleased(java.awt.event.MouseEvent e) {				
				
		        if (e.getButton()== java.awt.event.MouseEvent.BUTTON3) {  	
		                        
		            jDialog.setLocation(e.getX()-45, e.getY()-80); 	
		            jDialog.setVisible(true);
		            
		        }      
		        
		    }   		
		
    	});
    	
    	//TODO Trayicon Actionlistener
    	trayIcon.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
								
				systemTray.remove(trayIcon);				
				setVisible(true);	
				setState(0);
				
			}
			
		});		

    	//TODO JFrame Windowlistener
    	WindowListener frameListener = new WindowAdapter() {
    		
    		@Override
			public void windowIconified(WindowEvent arg0) {
				
				Systemtray_JDialog.this.setVisible(false);
				
				systemTray = SystemTray.getSystemTray();
				
		        try {
		        	
					systemTray.add(trayIcon);
					
				} catch (AWTException e) {
					
					e.printStackTrace();
					
				}
				
			}
    		
		};	
		this.addWindowListener(frameListener);
		
		this.setSize(250,250);		
		this.setLocationRelativeTo(null);
		this.setVisible(true);
		
	}

	//TODO JDialog
	private void createJDialog() {
		
		jDialog = new JDialog();
        jDialog.setSize(150, 80);
        jDialog.setAlwaysOnTop(true);
        jDialog.setUndecorated(true);
        
        JPanel mainPanel = new JPanel(null){
        	
        	 public void paint(Graphics g) {
        		 
        		 g.setColor(Color.LIGHT_GRAY);
        		 g.drawRect(0, 0, 149, 79);
        		 g.setColor(Color.BLACK);
        		 g.drawLine(25, 5, 25, 75);
        		 g.drawLine(25, 52, 145, 52);
        		 
        		 super.paintComponents(g);
        		 
        	 }
        	 
        };       
        
        openLabelIcon = new JLabel();
        openLabelIcon.setIcon(icon);
        openLabelIcon.setBounds(5, 5, 20, 21);
        openLabelIcon.setOpaque(true);             
        
        openLabel = new JLabel("Open");        
        openLabel.setBounds(30, 5, 115, 21);
        openLabel.setFont(new Font("Arial",Font.PLAIN,16));
        openLabel.setOpaque(true);
        
        messageLabelIcon = new JLabel();
        messageLabelIcon.setIcon(icon);
        messageLabelIcon.setBounds(5, 30, 20, 20);
        messageLabelIcon.setOpaque(true);             
        
        messageLabel = new JLabel("Message");        
        messageLabel.setBounds(30, 28, 115, 22);
        messageLabel.setFont(new Font("Arial",Font.PLAIN,16));
        messageLabel.setOpaque(true);
        
        exitLabelIcon = new JLabel();
        exitLabelIcon.setIcon(icon);
        exitLabelIcon.setBounds(5, 55, 20, 20);
        exitLabelIcon.setOpaque(true);             
        
        exitLabel = new JLabel("Exit");        
        exitLabel.setBounds(30, 55, 115, 21);
        exitLabel.setFont(new Font("Arial",Font.PLAIN,16));
        exitLabel.setOpaque(true);        
        
        border = LineBorder.createGrayLineBorder();        
        
        //TODO Label Mouselistener
        MouseAdapter labelMouseListener = new MouseAdapter() {
        	
            @Override
            public void mouseEntered(MouseEvent e) {
            	
            	if(e.getSource()==openLabel){
            		
            		openLabel.setBorder(border); 
            		openLabel.setForeground(Color.RED);
                	openLabelIcon.setIcon(icon2);
                	
            	} else if(e.getSource()==messageLabel){
            		     
            		messageLabel.setBorder(border); 
            		messageLabel.setForeground(Color.RED);
                	messageLabelIcon.setIcon(icon2);
            		
            	} else if(e.getSource()==exitLabel){
            		            		
            		exitLabel.setBorder(border);   
            		exitLabel.setForeground(Color.RED);
                	exitLabelIcon.setIcon(icon2);
            		
            	}           	
            	
            }

            @Override
            public void mouseExited(MouseEvent e) {            	
  
            	if(e.getSource()==openLabel){
            		
            		openLabel.setBorder(null);
            		openLabel.setForeground(Color.BLACK);
                	openLabelIcon.setIcon(icon);
                	
            	} else if(e.getSource()==messageLabel){
            		     
            		messageLabel.setBorder(null);
            		messageLabel.setForeground(Color.BLACK);
                	messageLabelIcon.setIcon(icon);
            		
            	} else if(e.getSource()==exitLabel){
            		            		
            		exitLabel.setBorder(null);
            		exitLabel.setForeground(Color.BLACK);
                	exitLabelIcon.setIcon(icon);
            		
            	}            	
            	
            }
            
            @Override
            public void mouseReleased(MouseEvent e) {            	
                           	
            	if(e.getButton()== MouseEvent.BUTTON1){
            		
            		if(e.getSource()==openLabel){
                		
            			systemTray.remove(trayIcon);				
        				setVisible(true);	
        				setState(0);
                		
                    	
                	} else if(e.getSource()==messageLabel){
                		     
                		JOptionPane.showMessageDialog(null, "Hello World !");
                		messageLabel.setBorder(null); 
                		messageLabel.setForeground(Color.BLACK);
                    	messageLabelIcon.setIcon(icon);
                		
                	} else if(e.getSource()==exitLabel){
                		            		
                		System.exit(0);
                		
                	}  
            		
            	}           	      	
            	
            }

		};
		openLabel.addMouseListener(labelMouseListener);
		messageLabel.addMouseListener(labelMouseListener);
		exitLabel.addMouseListener(labelMouseListener);	
		
		mainPanel.add(messageLabelIcon);  
        mainPanel.add(messageLabel);  
        mainPanel.add(openLabelIcon);  
        mainPanel.add(openLabel);	
		mainPanel.add(exitLabelIcon);  
        mainPanel.add(exitLabel);       		
		jDialog.add(mainPanel);
		
	}	
	
}


CopyPaste, 2 icons (16x16 oder nach wahl) einfügen und schon sollte alles schnurren :)

MfG
JavaAtro
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JPopupMenu per Klick schließen und gleichzeitig ActionEvent auf JButton? AWT, Swing, JavaFX & SWT 15
S Swing JPopupMenu nicht schließen AWT, Swing, JavaFX & SWT 2
T JPopupMenu "schließen" AWT, Swing, JavaFX & SWT 7
G Schließen von JPopupMenu AWT, Swing, JavaFX & SWT 14
L Wie adde ich ein JPopUpMenu AWT, Swing, JavaFX & SWT 3
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
P Event Handling Listener beim öffnen von einem JPopupMenu AWT, Swing, JavaFX & SWT 3
M Accelerator zu JMenuItem des JPopupMenu einer JList AWT, Swing, JavaFX & SWT 2
S Swing JPopupMenu visible AWT, Swing, JavaFX & SWT 4
xehpuk Swing Listener für JPopupMenu AWT, Swing, JavaFX & SWT 3
hdi Workaround: TrayIcon & JPopupMenu AWT, Swing, JavaFX & SWT 3
K Swing Listener bei JPopupMenu AWT, Swing, JavaFX & SWT 9
S JPopupMenu oder JCombobox die JList oeffnet..? AWT, Swing, JavaFX & SWT 7
A Swing in JPopupMenu die JRadioButtonMenuItems durchlaufen AWT, Swing, JavaFX & SWT 3
T JmenuItems in JPopupMenu kontextabhängig deaktivieren AWT, Swing, JavaFX & SWT 2
pinerski Probleme mit JPopupMenu und JMenuItem AWT, Swing, JavaFX & SWT 7
hdi Swing JPopupMenu: Größe AWT, Swing, JavaFX & SWT 4
B JPopupMenu, getParent Problem... AWT, Swing, JavaFX & SWT 2
Dragonfire width of JPopupMenu StyleBug AWT, Swing, JavaFX & SWT 3
M JPopupMenu - Ein vorhandenes Kontextmenü erweitern AWT, Swing, JavaFX & SWT 6
Iron Monkey JPopupMenu/JMenuItem Index für getSubElements()[] ermitteln AWT, Swing, JavaFX & SWT 8
X JPopupMenu Items aktualisieren sich nicht AWT, Swing, JavaFX & SWT 3
M jPopupMenu AWT, Swing, JavaFX & SWT 2
M jPopupMenu - Problem bei der Positionierung AWT, Swing, JavaFX & SWT 3
N JPopupMenu - ausgewähltes Element zurückgeben AWT, Swing, JavaFX & SWT 2
P JPopupMenu scrollen AWT, Swing, JavaFX & SWT 2
A JPopupMenu: Nach oben aufpoppen AWT, Swing, JavaFX & SWT 9
S Problem mit JPopupMenu AWT, Swing, JavaFX & SWT 3
T JPopupMenu wird bei Rechtsklick angezeigt! AWT, Swing, JavaFX & SWT 3
Firefork JPopupMenu unter einem Schalter darstellen AWT, Swing, JavaFX & SWT 2
K Netbeans GUI Builder (Matisse) und erstellen von JPopupMenu AWT, Swing, JavaFX & SWT 1
I In JPopupMenu scrollen AWT, Swing, JavaFX & SWT 4
M JPopupMenu per linker Maustaste öffnen AWT, Swing, JavaFX & SWT 9
V Beliebige Komponenten in einem JPopupMenu? AWT, Swing, JavaFX & SWT 3
F Problem mit JPopupMenu AWT, Swing, JavaFX & SWT 3
C JPopUpMenu in einem JTree ist lahm AWT, Swing, JavaFX & SWT 14
V JPopupMenu Problem und Tipp zu mouse/key AWT, Swing, JavaFX & SWT 3
F JPopupMenu und AbstractAction AWT, Swing, JavaFX & SWT 2
N Problem mit JPopupMenu und alwaysOnTop AWT, Swing, JavaFX & SWT 4
G Problem mit JPopupMenu AWT, Swing, JavaFX & SWT 30
R Hässlicher Punkt bei JPopupMenu AWT, Swing, JavaFX & SWT 12
S JPopupMenu - Kontrolliert beenden AWT, Swing, JavaFX & SWT 3
C Problem mit JPopupMenu AWT, Swing, JavaFX & SWT 6
T java.awt.IllegalComponentStateException bei JPopupMenu AWT, Swing, JavaFX & SWT 6
G Problem mit JPopupMenu und Menüauswahl AWT, Swing, JavaFX & SWT 4
R JPopupMenu,JScrollPane + repaint AWT, Swing, JavaFX & SWT 8
D Probleme bei der Positionierung von JPopupMenu AWT, Swing, JavaFX & SWT 2
J "Problem" mit JPopupMenu AWT, Swing, JavaFX & SWT 7
G JPopupMenu in JTable AWT, Swing, JavaFX & SWT 4
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
S GUI Schließen Button auf der linken Seite AWT, Swing, JavaFX & SWT 2
emma_louisa JavaFX MenuBar Zweitfenster; bei Button "Abbrechen" nur das Zweitfenster schließen AWT, Swing, JavaFX & SWT 2
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
T JavaFX Dialog schließt ohne dass es schließen soll AWT, Swing, JavaFX & SWT 1
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T Fenster schließen AWT, Swing, JavaFX & SWT 4
R JFrame schließen AWT, Swing, JavaFX & SWT 9
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
D JavaFX Beim Schließen (Rotes X) Code ausführen AWT, Swing, JavaFX & SWT 1
D Geöffnetes Dialogfenster schließen AWT, Swing, JavaFX & SWT 11
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
T Event Handling JDialog schließen, sobald ein neuer erzeugt wird AWT, Swing, JavaFX & SWT 3
O Neuen JFrame öffnen und alten schließen AWT, Swing, JavaFX & SWT 7
D Swing Schließen von JDialog soll auch JFrame schließen. AWT, Swing, JavaFX & SWT 4
C Programm mit Passwort schließen AWT, Swing, JavaFX & SWT 5
E JavaFX JavaFX Fenster nicht schließen AWT, Swing, JavaFX & SWT 4
thet1983 offne Fenster gemeinsam schließen AWT, Swing, JavaFX & SWT 8
F Swing JDialog schließen - WindowListener bekommt dispose nicht mit AWT, Swing, JavaFX & SWT 0
U Swing Beim Bedienen eines Buttons JFrame schließen AWT, Swing, JavaFX & SWT 2
W SWT Dialog richtig schließen? AWT, Swing, JavaFX & SWT 0
I JFrame mit JButton schließen? AWT, Swing, JavaFX & SWT 0
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
U Mehrere Oberflächeninstanzen seperat schließen AWT, Swing, JavaFX & SWT 5
VfL_Freak AWT Browser öffnen und schließen via java.awt.Desktop AWT, Swing, JavaFX & SWT 4
L Event Handling windowAdapter - NullPointerException beim Schließen AWT, Swing, JavaFX & SWT 5
R SWT Wizard schließen AWT, Swing, JavaFX & SWT 2
M Swing Einzelne Fenster schließen AWT, Swing, JavaFX & SWT 2
L SWT Eingabefelder beim Schließen des Forms auslesen AWT, Swing, JavaFX & SWT 3
M Swing ButtonListener Fenster schließen AWT, Swing, JavaFX & SWT 15
C Swing Wie kann ich im Programm das Menü schließen AWT, Swing, JavaFX & SWT 2
J Swing JInternalFrame schließen ändern? AWT, Swing, JavaFX & SWT 7
S JDialog per Button schließen AWT, Swing, JavaFX & SWT 2
M Fenster schließen - Listener AWT, Swing, JavaFX & SWT 5
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
S Fremdes Fenster schließen AWT, Swing, JavaFX & SWT 2
E Fenster schließen und ein anderes öffnen AWT, Swing, JavaFX & SWT 9
L Frame Schließen und neustarten AWT, Swing, JavaFX & SWT 4
qwerqer Swing JDialog Darstellungsprobleme - Dialog lässt sich nicht schließen AWT, Swing, JavaFX & SWT 3
Madlip SWT DateTime Widget Schließen AWT, Swing, JavaFX & SWT 4
K beim Schließen des JFrames, Methode aufrufen AWT, Swing, JavaFX & SWT 3
X Öffnen Schließen Fenster AWT, Swing, JavaFX & SWT 4
J Schließen über x soll zwei Prozesse beenden AWT, Swing, JavaFX & SWT 7
J Programm schließen AWT, Swing, JavaFX & SWT 4
H Anwendung schließen ohne System.exit AWT, Swing, JavaFX & SWT 5
0 Fenster schließen AWT, Swing, JavaFX & SWT 2
B AWT mehrere Fenster schließen AWT, Swing, JavaFX & SWT 8
D Fenster schließen AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben