1

我有一个 JPopupMenu 并在其中插入一些 JMenuItems。我需要的是一个看起来与普通 doe 相同但不可点击的 JMenuItem。

我试过了:

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。没有鼠标悬停事件不能点击,只是其他 JMenuItems 的标题类别。例如,一个空的 JMenuItem 仍然有 mouseover 事件。我正在寻找一种消除所有影响的方法或属性。

那么我是否必须重写所有事件才能做到这一点?

4

3 回答 3

2

由于目的是创建标题,而不仅仅是非活动组件,因此您可以使用 a JLabel。通常,您可以将任何内容添加JComponent到菜单中。

为避免混淆用户,应将其与普通菜单项明确区分开来。大多数软件在菜单中没有标题,因此您应该考虑添加它们是否会导致比没有它们更多的问题。

可以利用其他地方熟悉的用户界面元素,我用它来证明下面的 web 样式 megamenu (不能让自己将标题引入普通菜单,所以请原谅使用自定义布局的复杂性,并直接添加到因此弹出窗口):

在此处输入图像描述

代码:

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();
            }
        });
    }
}
于 2013-08-22T08:30:23.660 回答
0

您可以覆盖(并重新定义)可点击方法。你可以有一个自定义的 JMenuItem。

于 2013-08-21T12:17:48.917 回答
0

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

于 2013-08-21T13:11:34.037 回答