在任务栏的弹出菜单中添加垂直分隔符

7
如何在任务栏应用程序的弹出菜单中增加垂直分隔线?
   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);

menu.addSeparator()语句可以添加一条水平分隔线。我还想添加一个垂直分隔线像:

enter image description here

我该如何做到这一点?


1
没有主意,只给有趣的问题加1。 - mKorbel
2个回答

6

一个简单的技巧是在JMenuItem中添加一个空图标。这样,外观就会添加您要查找的垂直分隔符(当然,这仅适用于Windows L&F,其他L&F可能呈现不同):

菜单示例结果

产生它的代码:

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();
            }
        });
    }

}

我不明白你的意思。你是说垂直分隔符会自动添加吗?虽然我尝试过,但没有结果。添加的代码 & 外观的代码 - Suhail Gupta
@SuhailGupta 是的,在Swing中它会自动显示(请在您的PC上运行我的示例)。现在,您需要使用Swing JPopupMenu而不是AWT PopupMenu。由于您无法直接在TrayIcon上设置它,请使用此代码片段使其出现:trayIcon.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { jpopup.setLocation(e.getX(), e.getY()); jpopup.setInvoker(jpopup); jpopup.setVisible(true); } } }); - Guillaume Polet
你的代码运行良好。但是我添加鼠标监听器后编写的代码没有显示垂直滚动条。代码。问题出在哪里? - Suhail Gupta
@SuhailGupta 我更新了我的代码,使用了SystemTray和TrayIcon。它完全符合你的要求。 - Guillaume Polet
你的代码总是正常工作。但我遇到了一些问题。不知道为什么,当我运行我的代码时,我看不到垂直分隔符。我们可以在这里 @ Guillaume Polet和Suhail之间的讨论 讨论这个问题吗? - Suhail Gupta

1

想法

  1. JMenuItem(s) 添加 Borders(例如 MatteBorders

  2. JPanel 添加到 JPopup

    • 必须为 JPopup 设置 BorderLayout,并将 JPanel 放置在 CENTER area(和/或使用 Borders

    • JPanel 设置 BorderLayout

    • 在那里将 JSeparator 放置在 EASTWEST 区域(取决于方向)

    • 在那里放置另一个带有模拟 JMenuItemJButtonsJPanel(在第一眼看上去没有区别),并输出到 Swing ActionActionListener

  3. JPopup 相同的事情也适用于 JWindow(我默认使用它代替 JPopupToolTip

  4. 也许我错了,但是 JPopup 看起来像 chameleon

    • 有时作为 JPanel

    • 另一次作为 JWindow

    • 抱歉没有更深入的了解和兴趣


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接