我有一个JPopupMenu,正在其中插入一些JMenuItems。我需要的是一个JMenuItem,它看起来与普通的doe相同,但不可单击。
我尝试了:
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);
这里的问题是通过使用setEnabled方法更改了menu1的外观。
有什么方法可以做,还是必须将未启用的JMenuItem的外观改回普通的JMenuItem?
我需要不执行任何操作的JMenuItem。没有Mouseover事件,不能单击其他JMenuItems的标题类别。例如,空的JMenuItem仍具有鼠标悬停事件。我正在寻找消除所有影响的方法或属性。
那么我是否必须重写所有事件才能做到这一点?
最佳答案
由于目的是创建标题,而不仅仅是创建不活动的组件,因此可以使用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();
}
});
}
}