【问题标题】:Adding a vertical separator in PopupMenu, in the task bar在任务栏中的 PopupMenu 中添加垂直分隔符
【发布时间】:2012-09-28 11:08:28
【问题描述】:

如何在任务栏应用的弹出菜单中添加垂直分隔符?

   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() 语句添加了一个水平分隔符。我还想要一个垂直分隔符,例如:

我该怎么做?

【问题讨论】:

  • 不知道,只为有趣的问题 +1

标签: java swing jmenuitem jpopup jseparator


【解决方案1】:

一个简单的技巧是向 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();
            }
        });
    }

}

【讨论】:

  • 我不明白你..你的意思是垂直分隔符会自己添加?我试过这个但没有结果。 code of addition & code of look and feel
  • @SuhailGupta 是的,在 Swing 中它会自动出现(尝试在您的 PC 上运行我的示例)。现在,您需要使用 Swing JPopupMenu 而不是 AWT PopupMenu。既然不能直接在TrayIcon上设置,就用这个sn-p让它出现:trayIcon.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { jpopup.setLocation(e.getX(), e.getY()); jpopup.setInvoker(jpopup); jpopup.setVisible(true); } } });
  • 您的代码运行良好。但是我在添加鼠标侦听器后所做的代码没有显示竖线。 code。有什么问题?
  • @SuhailGupta 我更新了我的代码以使用 SystemTray 和 TrayIcon。它完全符合您的要求。
  • 您的代码始终运行良好。但我遇到了一些问题。不知道是什么,但是当我运行我的书面代码时,我没有看到垂直分隔符。我们可以在这里讨论这个问题吗@@discussion between Guillaume Polet and Suhail
【解决方案2】:

想法

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

  2. JPanel 添加到JPopup

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

    • BorderLayout设置为JPanel

    • JSeparator 放在EASTWEST 区域(取决于或方向)

    • 放另一个JPanelJButtons,模拟JMenuItem(第一眼没有差异)输出到Swing ActionActionListener

  3. JWindow 相同(我默认使用JPopupToolTip)而不是JPopup

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

    • 曾经是JPanel

    • 另一个JWindow

    • 抱歉没有最深入的了解,对

    • 感兴趣

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 2019-10-24
    • 2013-10-15
    • 2022-01-23
    • 2021-04-30
    • 2020-06-06
    • 1970-01-01
    • 2016-12-12
    • 2018-05-04
    相关资源
    最近更新 更多