首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向JPanel添加JMenu

向JPanel添加JMenu
EN

Stack Overflow用户
提问于 2013-02-08 19:21:47
回答 3查看 11.1K关注 0票数 2

我需要在JPanel中有一个JMenu (右边带箭头的那个可以显示JMenuItem)。问题是,当我这样做的时候,JMenu在鼠标翻转时并没有激活...我不知道如何做到这一点,如果它是可能的。

EN

回答 3

Stack Overflow用户

发布于 2013-02-08 19:49:12

如果您将JMenu包装在JMenuBar中,它将按预期工作。

下面是一个演示示例:

代码语言:javascript
运行
复制
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class TestMenus {

    private JMenuBar createMenuBar(String name, int depth) {
        JMenuBar bar = new JMenuBar();
        bar.add(createMenu(name, depth));
        return bar;
    }

    private JMenu createMenu(String name, int depth) {
        JMenu menu = new JMenu(name);
        for (int i = 0; i < 5; i++) {
            if (depth > 0) {
                menu.add(createMenu("sub-" + name, depth - 1));
            }
        }
        for (int i = 0; i < 5; i++) {
            menu.add(createMenuItem("Menu item " + (i + 1)));
        }
        return menu;
    }

    private JMenuItem createMenuItem(String name) {
        final JMenuItem jMenuItem = new JMenuItem(name);
        jMenuItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(jMenuItem, "Successfully pressed a menu item");
            }
        });
        return jMenuItem;
    }

    protected void initUI() {
        JFrame frame = new JFrame(TestMenus.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createMenuBar("Root menu", 3));
        frame.pack();
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                new TestMenus().initUI();
            }
        });
    }

}

结果是:

票数 3
EN

Stack Overflow用户

发布于 2013-03-27 09:45:59

这是另一种解决这个问题的方法,我认为它更接近于你想要的。它涉及到扩展JMenuBar,使其具有JMenu对象的外观。

该类包含一个名为menu的JMenu对象。add方法被覆盖了,所以您要添加到menu而不是JMenuBar (您可能需要覆盖更多的add方法才能使其更完美)。

绘画有几个选项。我不确定你是否想要JMenuBar的按钮样式的外观,所以我在一些自定义选项上添加了一些注释,以及JMenuBar的下划线外观。

下面是没有边框的按钮外观的结果:

下面是没有按钮外观和边框的结果:

代码语言:javascript
运行
复制
import java.awt.*;
import javax.swing.*;

public class JPanelMenu extends JMenuBar{

public static void main(String[] args) {
    JFrame f = new JFrame("Menu Test");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JMenu jmenu = new JMenu("J Menu");
    jmenu.add(new JMenuItem("Menu Item"));

    JPanelMenu m = new JPanelMenu("Menu");
    m.add(jmenu);
    m.add(new JMenuItem("Menu Item 1"));
    m.add(new JMenuItem("Menu Item 2"));

    JPanel background = new JPanel();
    background.add(m);      
    f.setContentPane(background);
    f.pack();
    f.setVisible(true);
}

//This is the JMenu that is shown
private JMenu menu;

public JPanelMenu(String title) {
    super();
    menu = new JMenu(title);
    super.add(menu);
}

@Override
public Component add(Component comp) {
    //You add the the JMenu instead of the JMenuBar
    return menu.add(comp);
}

@Override
public JMenu add(JMenu c) {
    //You add the the JMenu instead of the JMenuBar
    return (JMenu) menu.add(c);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    //Include these two lines to remove the button look
    //Or remove this method to keep the button look
    //g.setColor(getBackground());
    //g.fillRect(0, 0, getWidth(), getHeight());
}

@Override
protected void paintBorder(Graphics g) {
    //Remove this line to remove the underline look
    //when you remove the button look
    //An alternative is to you setBorderPainted(false);
    //when you create the object or in the constructor
    //Or remove this method to keep the border
    //super.paintBorder(g);
}
}
票数 2
EN

Stack Overflow用户

发布于 2013-02-08 19:25:57

您必须在JPanel布局中传递一个BorderLayout,然后才能在面板中添加菜单栏:

代码语言:javascript
运行
复制
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
p.add(menubar, BorderLayout.NORTH);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14771437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档