2012-09-28 10 views
7

Come è possibile aggiungere un separatore verticale nel menu a comparsa dell'app nella barra delle attività?Aggiunta di un separatore verticale in PopupMenu, nella barra delle attività

tray = SystemTray.getSystemTray();    
    openMenuItem = new MenuItem("Open P"); 
    stopKLMenuItem = new MenuItem("Stop"); 
    exitMenuItem = new MenuItem("exit"); 
    menu.add(exitMenuItem); 
    menu.add(stopKLMenuItem); 
    menu.addSeparator(); // adds a horizontal separator 
    menu.add(openMenuItem); 
    trayIcon = new TrayIcon(image,"P",menu); 

La dichiarazione menu.addSeparator() aggiunge un separatore orizzontale. Volevo anche un separatore verticale come:

enter image description here

Come posso fare questo?

+1

idea, solo uno per domanda interessante – mKorbel

risposta

6

Una semplice trucco è quello di aggiungere un'icona vuota al JMenuItem.L'aspetto grafico poi aggiunge il separatore verticale siete alla ricerca di (naturalmente, questo funziona solo con Windows L & F, altro L & F può rendere in modo diverso):

Menu example result

e il codice che prodotta:

import java.awt.AWTException; 
import java.awt.SystemTray; 
import java.awt.TrayIcon; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 

import javax.swing.ImageIcon; 
import javax.swing.JMenuItem; 
import javax.swing.JPopupMenu; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestTrayIcon { 

    protected void initUI() { 

     TrayIcon trayIcon = new TrayIcon(new ImageIcon(
       "http://3.bp.blogspot.com/-nh7fv5FqpU4/TeUbTvAdSkI/AAAAAAAAAUo/Ig53KJGvzlk/s45/avatar.png").getImage()); 

     final JPopupMenu popupMenu = new JPopupMenu(); 
     JMenuItem checkBox1 = new JMenuItem("Last checked...", new ImageIcon(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB))); 
     JMenuItem checkBox2 = new JMenuItem("Open..."); 

     popupMenu.add(checkBox1); 
     popupMenu.addSeparator(); 
     popupMenu.add(checkBox2); 

     trayIcon.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseReleased(MouseEvent e) { 
       if (e.isPopupTrigger()) { 
        popupMenu.setLocation(e.getX(), e.getY()); 
        popupMenu.setInvoker(popupMenu); 
        popupMenu.setVisible(true); 
       } 
      } 
     }); 
     try { 
      SystemTray.getSystemTray().add(trayIcon); 
     } catch (AWTException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (InstantiationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (UnsupportedLookAndFeelException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       new TestTrayIcon().initUI(); 
      } 
     }); 
    } 

} 
+0

non capisco you..You dire separatore verticale verrà aggiunto il proprio? Ho provato questo, ma senza risultato. [codice di aggiunta] (http://i46.tinypic.com/2ia7evm.jpg) ** & ** [codice di aspetto grafico] (http://i47.tinypic.com/2zjlyxz.jpg) –

+0

@SuhailGupta Sì, in Swing appare automaticamente (prova ad eseguire il mio esempio sul tuo PC). Ora, è necessario utilizzare un menu JPopup di Swing e non il PopupMenu di AWT. Dal momento che non è possibile impostare sul TrayIcon direttamente, utilizzare questo frammento per far sembrare: 'trayIcon.addMouseListener (nuova MouseAdapter() { public void mouseReleased (MouseEvent e) { se (e.isPopupTrigger()) { jpopup.setLocation (e.getX(), e.getY()); jpopup.setInvoker (jpopup); jpopup.setVisible (true); }} }); ' –

+0

Il tuo codice funziona bene . Ma il codice che ho creato dopo aver aggiunto il listener del mouse non mostra la barra verticale. [** ** code] (http://i49.tinypic.com/5n9lr6.jpg). Qual è il problema ? –

1

idee

  1. aggiungere Borders (MatteBorders per esempio) per il JMenuItem(s)

  2. aggiungere JPanel al JPopup

    • necessario impostare BorderLayout per JPopup e mettere a JPanel la CENTER area (e/o con Borders troppo)

    • impostare BorderLayout per JPanel

    • lì mettere JSeparator all'area EAST o WEST (dipende o direzione)

    • ci mettere un'altra JPanel con JButtons che simulare JMenuItem (non diffidenza da 1a vista) con uscita su Swing Action o ActionListener

  3. le stesse cose con JWindow (I utilizzando di default al posto JPopup o ToolTip) invece di JPopup

  4. forse mi sbaglio ma JPopup sembra che come chameleon

    • una volta al momento in cui JPanel,

    • altro come JWindow,

    • dispiace non più profonda conoscenza, l'interesse su