Java 固定JPOPUPMENUS分隔符(GTK LaF)和项目突出显示

Java 固定JPOPUPMENUS分隔符(GTK LaF)和项目突出显示,java,swing,popup,Java,Swing,Popup,昨天,我第一次使用Swing开发了一个快速桌面应用程序(我确实是swt的粉丝…) 顺便说一句,我在使用JPOppMenu时遇到了几个问题: 1) 对于GTK LaF,分离器不显示 2) 当将鼠标移到菜单项上时,它们不会突出显示(在linux和win上看到)我决定扩展JPopupMenu类以解决上述两个问题,现在我只想共享代码,以防有人面临同样的问题 import java.awt.Dimension; import java.awt.event.MouseEvent; import java.a

昨天,我第一次使用Swing开发了一个快速桌面应用程序(我确实是swt的粉丝…)

顺便说一句,我在使用JPOppMenu时遇到了几个问题:

1) 对于GTK LaF,分离器不显示


2) 当将鼠标移到菜单项上时,它们不会突出显示(在linux和win上看到)

我决定扩展JPopupMenu类以解决上述两个问题,现在我只想共享代码,以防有人面临同样的问题

import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;

public class JPopupMenuEx
extends JPopupMenu
implements MouseListener {

    /**
     * 
     */
    private static final long serialVersionUID = -5352058505305990803L;

    @Override
    public void addSeparator() {
        add(new JSeparatorEx());
    }

    @Override
    public JMenuItem add(JMenuItem menuItem) {
        menuItem.addMouseListener(this);
        return super.add(menuItem);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        ((JMenuItem)e.getSource()).setArmed(true);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        ((JMenuItem)e.getSource()).setArmed(false);
    }

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    public class JSeparatorEx extends JSeparator{

        /**
         * 
         */
        private static final long serialVersionUID = 3477309905456341629L;

        public Dimension getPreferredSize() {
            Dimension d = super.getPreferredSize();

            if (d.height==0)
                d.height = 4;

            return d;
        }
    }
}
因此,您可以像使用JPopupMenu一样使用它,如下所示:

JPopupMenuEx popup = new JPopupMenuEx();
popup.add(new JCheckBoxMenuItem("Item 1"));
popup.addSeparator();
popup.add(new JMenuItem("Item 2"));
这是一个使用的变体,也是一个供将来参考的变体

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

/** @see http://stackoverflow.com/questions/7254488 */
public class JPopupMenuEx extends JPopupMenu {

    private MouseAdapter mouseListener = new MouseAdapter() {

        @Override
        public void mouseEntered(MouseEvent e) {
            ((JMenuItem) e.getSource()).setArmed(true);
        }

        @Override
        public void mouseExited(MouseEvent e) {
            ((JMenuItem) e.getSource()).setArmed(false);
        }
    };

    @Override
    public void addSeparator() {
        add(new JSeparatorEx());
    }

    @Override
    public JMenuItem add(JMenuItem menuItem) {
        menuItem.addMouseListener(mouseListener);
        return super.add(menuItem);
    }

    private static class JSeparatorEx extends JSeparator {

        @Override
        public Dimension getPreferredSize() {
            Dimension d = super.getPreferredSize();
            if (d.height == 0) {
                d.height = 4;
            }
            return d;
        }
    }

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

            @Override
            public void run() {
                JPopupMenuEx popup = new JPopupMenuEx();
                popup.add(new JCheckBoxMenuItem("Item 1"));
                popup.addSeparator();
                popup.add(new JMenuItem("Item 2"));
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel p = new JPanel();
                p.add(new JLabel("Right click for context menu."));
                p.setComponentPopupMenu(popup);
                f.add(p);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}

所以这是毫无疑问的,对吗?是的,你是对的!我只是想和大家分享一个解决方案,因为有时候你需要花几个小时来解决“表面”问题,而你却想专注于应用程序的核心…:)考虑使用来减少杂乱。@ TrasVald,这是SaleStAppyMod之一,因为我是RouWestHyyMyLoad的追随者,这个SEFL答案是真的,非常好,非常好:-)MkBoel:啊,我忘了;如果将Java与
GTKLookAndFeel
@trashgood一起使用,我从问题中得出了答案,以符合标准堆栈溢出样式。lviggiani,别忘了你可以通过点击绿色复选标记来接受你自己的答案。始终使用SSCCE,我多长时间没有看到JSepator,谢谢示例+1