gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:16:04 25 4
gpt4 key购买 nike

我有一个 JPopupMenu 并在其中插入一些 JMenuItems。我需要的是一个看起来与普通母鹿相同但不可单击的 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);

这里的问题是使用 setEnabled 方法改变了 menu1 的外观。有什么方法可以做到这一点,还是我必须将未启用的 JMenuItem 的外观更改回正常的 JMenuItem?

我需要一个不执行任何操作的 JMenuItem。没有不可点击的鼠标悬停事件,只是其他 JMenuItems 的标题类别。例如,空的 JMenuItem 仍然具有鼠标悬停事件。我正在寻找一种可以消除所有影响的方法或属性。

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

最佳答案

由于目的是创建 header ,而不仅仅是创建非 Activity 组件,因此您可以使用 JLabel 来实现此目的。一般来说,您可以将任何 JComponent 添加到菜单中。

为了避免让用户感到困惑,它应该与正常的菜单项明显区分开来。大多数软件在菜单中没有标题,因此您应该考虑添加它们是否会比没有它们引起更多问题。

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

enter image description here

代码:

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();
}
});
}
}

关于java - 使 JMenuItem 不可单击,但使用与普通 JMenuItem 相同的外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18356866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com