首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使JMenuItem不可单击,但使用与普通JMenuItem相同的外观

使JMenuItem不可单击,但使用与普通JMenuItem相同的外观
EN

Stack Overflow用户
提问于 2013-08-21 12:01:29
回答 3查看 2.8K关注 0票数 1

我有一个JPopupMenu,并在其中插入一些JMenuItems。我需要的是一个JMenuItem,它看起来和普通的doe一样,但不能点击。

我试了一下:

代码语言:javascript
复制
JPopupMenu popmen = new JPopupMenu();

JMenuItem menu1 = new JMenuItem("Add new Datasource:");
JMenuItem menu2 = new JMenuItem("Join");

menu1.setEnabled(false);
popmen.add(menu1);
popmen.addSeparator();
popmen.add(menu2);

这里的问题是,通过使用menu1方法,setEnabled的外观正在改变。是否有任何方法来执行此操作,或者是否必须将未启用的JMenuItem的外观更改为正常的JMenuItem?

我需要一个什么都不做的JMenuItem。没有Mouseover事件,不能单击,只有另一个JMenuItems的标题类别。例如,空的JMenuItem仍然具有mouseover事件。我在寻找一种消除所有影响的方法或属性。

那么,我必须重写所有的事件才能做到这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-22 08:30:23

因为目的是创建一个标头,而不仅仅是一个不活动的组件,所以您可以为此使用一个JLabel。通常,您可以将任何JComponent添加到菜单中。

为了避免混淆用户,它应该清楚地区别于正常的菜单项。大多数软件在菜单中没有标题,所以您应该考虑添加它们比没有标题是否会带来更多的问题。

可以利用其他地方熟悉的用户界面元素,我用这些元素对下面的web样式megamenu进行了验证(无法将标题介绍到普通菜单中,因此请原谅使用自定义布局的复杂性,并因此直接添加弹出窗口):

这方面的守则:

代码语言:javascript
复制
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.*;

public class MenuSample {
    MenuSample() {
        JFrame frame = new JFrame("Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);

        JMenu menu = new JMenu("Megamenu");
        JPopupMenu popup = menu.getPopupMenu(); 
        popup.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        menuBar.add(menu);
        gbc.gridx = 0;
        gbc.gridy = 0;
        popup.add(createHeader("Header 1"), gbc);
        gbc.gridy++;
        popup.add(new JMenuItem("Item 1"), gbc);
        gbc.gridy++;
        popup.add(new JMenuItem("Item 2"), gbc);
        gbc.gridy++;
        popup.add(new JMenuItem("Item 3"), gbc);
        gbc.gridx++;
        gbc.gridy = 0;

        popup.add(createHeader("Header 2"), gbc);
        gbc.gridy++;
        popup.add(new JMenuItem("Item 3"), gbc);
        gbc.gridy++;
        popup.add(new JMenuItem("Item 4"), gbc);
        gbc.gridy++;
        popup.add(new JMenuItem("Item 5"), gbc);

        frame.pack();
        frame.setVisible(true);
    }

    private JComponent createHeader(String header) {
        JLabel label = new JLabel(header);
        label.setFont(label.getFont().deriveFont(Font.ITALIC));
        label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        return label;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MenuSample();
            }
        });
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-08-21 12:17:48

您可以重写(并重新定义)单击方法。您可以使用自定义JMenuItem。

票数 0
EN

Stack Overflow用户

发布于 2013-08-21 13:11:34

如果在单击菜单时不定义要触发的任何操作,那么它将有效地使菜单不可点击。如果要定义不可单击的菜单项组件,则还可以扩展JMenuItem类并重写addActionListener或addItemListener方法以拒绝侦听器,以便在单击菜单时不会触发任何操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18356866

复制
相关文章

相似问题

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