tutorials.de Buch-Aktion 02/2012
Like Tree2Danke
  • 1 Beitrag von miffi
  • 1 Beitrag von Tsunamii
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
614
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von January
    January January ist offline Mitglied Bronze
    Registriert seit
    Aug 2010
    Beiträge
    32
    Hallo zusammen.
    Nach langer, ergebnisloser Suche hoffe ich jetzt hier auf eine Antwort:

    Ich möchte, dass bei einem Rechts- und Links-Klick auf das TrayIcon jeweils ein unterschiedliches JPopupMenu (nicht PopupMenu) erscheint. Da "TrayIcon" nur PopupMenu und das auch kein zweites Menü unterstützt, habe ich das jetzt so gelöst:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    
    package test;
     
    import java.awt.AWTException;
    import java.awt.EventQueue;
    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.MouseAdapter;
    import java.awt.event.MouseEvent;
     
    import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;
     
    public class tray {
     
        final static SystemTray tray = SystemTray.getSystemTray();
        static TrayIcon trayIcon = null;
        final static JPopupMenu popupRechts = new JPopupMenu();
        final static JPopupMenu popupLinks = new JPopupMenu();
        final static JMenuItem itemLinks = new JMenuItem("Beispiel Links");
        final static JMenuItem itemRechts = new JMenuItem("Beispiel Rechts");
        final static JMenuItem beenden = new JMenuItem("Beenden");
     
        public static void traySymbol() {
            beenden.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    tray.remove(trayIcon);
                }
            });
            popupLinks.add(itemLinks);
            popupRechts.add(itemRechts);
            popupRechts.add(beenden);
            Runnable runner = new Runnable() {
                public void run() {
                    if (SystemTray.isSupported()) {
                        Image image = Toolkit.getDefaultToolkit().getImage(
                                getClass().getResource("/icons/clock.png"));
                        trayIcon = new TrayIcon(image, "PopUp-Text");
                        trayIcon.addMouseListener(new MouseAdapter() {
                            public void mouseReleased(MouseEvent e) {
                                int klick = e.getButton();
                                switch (klick) {
                                case 1: // Links-Klick
                                    popupLinks.setLocation(e.getX(), e.getY());
                                    popupLinks.setInvoker(popupRechts);
                                    popupLinks.setVisible(true);
                                    break;
                                case 2: // Mitte-Klick
                                    break;
                                case 3: // Rechts-Klick
                                    popupRechts.setLocation(e.getX(), e.getY());
                                    popupRechts.setInvoker(popupRechts);
                                    popupRechts.setVisible(true);
                                    break;
                                default:
                                    System.out.println("Unbekannter Maus-Klick!");
                                }
                            }
                        });
                        try {
                            tray.add(trayIcon);
                        } catch (AWTException e) {
                            System.err.println("Oeffnen im Tray nicht moeglich");
                        }
                    } else {
                        System.err.println("Tray nicht verfuegbar");
                    }
                }
            };
            EventQueue.invokeLater(runner);
        }
        
        public static void main(String[] args) {
            traySymbol();
        }
    }

    Nun zu meinem Problem: Wenn ich eins der Menüs anwähle kann ich es nicht durch "danebenklicken" oder esc. wieder abwählen. Es bleibt so lange offen bis ich einen Eintrag angeklickt habe.
    Hat jemand für euch eine Lösung für dieses Problem? Wenn es eine besser Lösung gibt zwei JPopupMenu mit einem Tray-Symbol zu verwenden immer her damit. Bin noch ein ziemlicher Java-Anfänger.

    Danke! January
     

  2. #2
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Howdie.

    Ich hab grad mal ein kurzes Sample geschrieben, um dein Problem zu testen. Dabei hab ich folgendes festgestellt: Ein Klick außerhalb des Popups deaktiviert dieses lediglich, wenn der Klick auf der Invoker-Komponente geschieht. In meinem Beispiel habe ich ein Hauptfenster (JFrame), das ich dem Popup-Aufruf im MouseListener als Invoker mitgegeben habe - dann funktioniert es. Ich poste hier mal den relevanten Ausschnitt aus meinen Sample-Code:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    class MySample extends JFrame {
         public MySample(){
        try {
                      // JFrame startup hier
                                ...
                              
                                // Sample
            SystemTray tray = SystemTray.getSystemTray();
            TrayIcon icon = new TrayIcon(testImage);
            tray.add(icon);
            icon.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e) {}
                public void mouseEntered(MouseEvent e) {}
                public void mouseExited(MouseEvent e) {}
                public void mousePressed(MouseEvent e) {}
        
                public void mouseReleased(MouseEvent e) {
                    
                    switch(e.getButton()){
                        case MouseEvent.BUTTON1:
                            
                            JPopupMenu pop1 = new JPopupMenu();
                            pop1.add(new JMenuItem("menu 1"));
                            pop1.add(new JMenuItem("menu 2"));
                            pop1.show(MySample.this, e.getX(), e.getY());
                            
                            break;
                        case MouseEvent.BUTTON3:
                            
                            JPopupMenu pop2 = new JPopupMenu();
                            pop2.add(new JMenuItem("menu 3"));
                            pop2.add(new JMenuItem("menu 4"));
                            pop12.show(MySample.this, e.getX(), e.getY());
                            
                            break;
                    }
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        } catch (AWTException e) {
            e.printStackTrace();
        }
     
         }
    }

    Und das ist jetzt kein guter Code!
    Das ist jetzt wirklich nur zum Testen, nimm dir das nicht als Grundlage für weitere Entwicklungen, ja?
    Da du Java-Anfänger bist, würde ich dir dringend empfehlen, erstmal einen Grundkurs durchzuarbeiten. Hier auf dem Board gibt es da zahlreiche Hilfestellungen. Z.B. solltest du dir bald abgewöhnen, alle verwendeten Komponenten statisch anzulegen. Auch das Runnable ist bei einer Start-Konfiguration nicht nötig, sowas wird erst sinnvoll, wenn du Multi-Threading realisieren willst.

    Gruß und viel Erfolg
    miffi
    January bedankt sich. 
    "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
    Douglas Adams

  3. #3
    Tsunamii Tsunamii ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    75
    wie wäre es mit folgendem Lösungsansatz?
    sobald du das Popupmenu verlässt wird es direkt geschlossen, oder du startest einen timer der nach x ms außerhalb des Menus dieses schließt
    da ich meinen Ansatz aber gerade nicht testen kann, weiß ich nicht ob dieser auch so funktioniert
    January bedankt sich. 

  4. #4
    Avatar von January
    January January ist offline Mitglied Bronze
    Registriert seit
    Aug 2010
    Beiträge
    32
    Danke miffi! Hat super geklappt!
    January

    Danke auch an Tsunamii, habe deine Lösung aber nicht getestet...
     

  5. #5
    Avatar von January
    January January ist offline Mitglied Bronze
    Registriert seit
    Aug 2010
    Beiträge
    32
    Da habe ich mich wohl etwas zu früh gefreut. Jetzt taucht (logischerweise) immer zusätzlich zu dem Traysymbol ein Fenster auf, wenn ich das Programm starte. Das Programm soll allerdings nur in dem Systemtray erreichbar sein. Gibt es eine Möglichkeit das Fenster auszublenden? setVisible(false) funktioniert nicht.
    Danke schon im Voraus!
    January

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    
    package test;
     
    import java.awt.AWTException;
    import java.awt.Image;
    import java.awt.SystemTray;
    import java.awt.Toolkit;
    import java.awt.TrayIcon;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    import javax.swing.JFrame;
    import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;
     
    public class traytest extends JFrame {
     
        private static final long serialVersionUID = -335717604718181053L;
        static SystemTray tray;
        static TrayIcon trayIcon;
        static JPopupMenu popupRechts;
        static JPopupMenu popupLinks;
        static JMenuItem itemRechts;
        static JMenuItem itemLinks;
        
        public traytest() {
            super("Dieses Fenster müsste weg");
            this.setSize(400,100);
            if (SystemTray.isSupported()) {
                Image image = Toolkit.getDefaultToolkit().getImage(
                        getClass().getResource("/icons/clock.png"));
                trayIcon = new TrayIcon(image, "Popup-Text");
                trayIcon.addMouseListener(new MouseListener() {
                    public void mouseReleased(MouseEvent e) {
                        switch (e.getButton()) {
                        case MouseEvent.BUTTON1: // Linksklick
                            popupLinks = new JPopupMenu(); 
                            itemLinks = new JMenuItem("links");
                            popupLinks.add(itemLinks);
                            popupLinks.show(traytest.this, e.getX(), 0);
                            break;
     
                        case MouseEvent.BUTTON3: // Rechtsklick
                            popupRechts = new JPopupMenu(); 
                            itemRechts = new JMenuItem("rechts");
                            popupRechts.add(itemRechts);
                            popupRechts.show(traytest.this, e.getX(), 0);
                            break;
                        }
                    }
     
                    public void mouseClicked(MouseEvent e) {
                    }
     
                    public void mouseEntered(MouseEvent e) {
                    }
     
                    public void mouseExited(MouseEvent e) {
                    }
     
                    public void mousePressed(MouseEvent e) {
                    }
                });
                try {
                    tray = SystemTray.getSystemTray();
                    tray.add(trayIcon);
                } catch (AWTException e) {
                    System.err.println("Oeffnen im Tray nicht moeglich");
                }
            } else {
                System.err.println("Tray nicht verfuegbar");
            }
        }
     
        public static void main (String ... args){
            traytest start = new traytest();
            start.setVisible(true);
        }
    }
     

  6. #6
    Avatar von January
    January January ist offline Mitglied Bronze
    Registriert seit
    Aug 2010
    Beiträge
    32
    Erledigt. Habe es schon selber rausgefunden. Anstatt JFrame einfach JWindow benutzen.
     

Ähnliche Themen

  1. Drag & Drop in SystemTray
    Von balmyAutumnDay im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 20.06.07, 15:00
  2. Antworten: 7
    Letzter Beitrag: 12.10.06, 16:39
  3. SystemTray Icon (c++ / API)
    Von darko-micic im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 11.09.05, 13:29
  4. SystemTray ToolTip
    Von keiler im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 08.03.03, 09:29
  5. Outlook Systemtray
    Von Gunnitarrist im Forum Office-Anwendungen
    Antworten: 2
    Letzter Beitrag: 08.01.02, 20:59

Stichworte