【问题标题】:Modify JPopupMenu/JMenuItem look and feel修改 JPopupMenu/JMenuItem 外观
【发布时间】:2021-02-26 08:29:58
【问题描述】:

我正在尝试创建一个具有不同颜色和圆形边框的自定义 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,0,w-1, h-1, 10, 10);
        g2.drawRoundRect(0,0,w-1, h-1, 10, 10);
        
        g2.setBackground(Color.red);
        g2.setColor(Color.green);
    }

}

这就是我希望圆形弹出菜单的样子:

我在我的paintComponent 方法中做错了吗?

【问题讨论】:

    标签: java jpopupmenu


    【解决方案1】:

    您的弹出窗口永远不可见,调用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, 2, 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();
                    }
                });
            }
        
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2011-06-11
      相关资源
      最近更新 更多