修改 JPopupMenu/JMenuItem 的外观和感觉 自定义

如何解决修改 JPopupMenu/JMenuItem 的外观和感觉 自定义

我正在尝试创建一个具有不同颜色和圆形边框的自定义 jpopupmenu。我尝试了以下代码,但 PopupMenu 的外观没有变化。

JButton button = new JButton("Test");
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e){
        TPopupMenu popup = new TPopupMenu();
        JMenuItem item1 = new JMenuItem("Item 1");
        JMenuItem item2 = new JMenuItem("Item 2");
        popup.add(item1);
        popup.add(item2);
    }
}

自定义弹出菜单

public class TPopupMenu extends jpopupmenu{

    public TPopupMenu(){
        super();
        super.setopaque(false);
        init();
    }
    
    private void init(){
        setBackground(Color.green);
    }
    
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        
        g.setColor(Color.pink);
        
        int w = getWidth();
        int h = getHeight();
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTILIAS_ON);
        
        g2.fillRoundRect(0,w-1,h-1,10,10);
        g2.drawRoundRect(0,10);
        
        g2.setBackground(Color.red);
        g2.setColor(Color.green);
    }

}

这就是我希望我的圆形弹出菜单看起来像这样:

enter image description here

我的paintComponent方法做错了吗?

解决方法

您的弹出窗口永远不可见,请调用 show​(Component invoker,int x,int y) 方法以显示 JPopupMenu 类。

在组件调用者坐标空间中的 x,y 位置显示弹出菜单...

      JPopupMenu popup = new JPopupMenu();
      JMenuItem item = new JMenuItem("Item");
      popup.add(item);
      popup.show(frame,frame.getWidth()/2,frame.getHeight()/2);

或者您也可以调用 JPopupMenu.setVisible(boolean b) 方法。

JPopupMenu#showJPopupMenu#setVisible


自定义

对于圆形边框,您可以使用 new LineBorder(Color.black,2,true)LineBorder doc

如果您想要大的自定义,我建议您使用/编写外观。见tutorial|uiswing

这是我的测试:

    public class Test {
    
        private static void createAndShowGUI() {
            JFrame frame = new JFrame("HelloWorldSwing");
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            JButton button = new JButton("Test");
    
            JPopupMenu popup = new JPopupMenu();
            popup.setBorder(new LineBorder(Color.black,true));
    
            {
                JMenuItem item = new JMenuItem("Cut");
                item.setForeground(Color.ORANGE);
                popup.add(item);
            }
    
            {
                JMenuItem item = new JMenuItem("Copy");
                item.setBackground(Color.RED);
                popup.add(item);
            }
    
            {
                JMenuItem item = new JMenuItem("Paste");
                popup.add(item);
            }
    
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    popup.show(frame,frame.getWidth() / 2,frame.getHeight() / 2);
                    System.out.println("perfome");
                }
            });
    
            frame.getContentPane().add(button);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    
    }

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?