# JPopupMenu schließen in SystemTray



## Spuddl (18. Mrz 2011)

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 (19. Mrz 2011)

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 (12. Sep 2012)

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 ^^


```
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


----------

