我有一个新的UI,我正在努力用Java实现,我在实现包含JMenu(以及几个JMenuItems)的JPopupMenu时遇到了麻烦,它本身包含几个JMenuItems。 JPopupMenu出现在我点击人民币的地方,它看起来不错,但是当我鼠标移动时,“连接”JMenu似乎没有任何孩子,尽管我尽最大努力.add()他们。
在线查看了几个例子,我没有看到任何专门为mouseEntered()实现一个侦听器来推出子项。我的想法是,我在菜单初始化方法中弄乱了一些东西。
我附上了相关的代码供你细读。
//Elsewhere...
private JPopupMenu _clickMenu;
//End Elsehwere...
private void initializeMenu()
{
_clickMenu = new JPopupMenu();
_clickMenu.setVisible(false);
_clickMenu.add(generateConnectionMenu());
JMenuItem menuItem;
menuItem = new JMenuItem("Configure");
addMenuItemListeners(menuItem);
_clickMenu.add(menuItem);
menuItem = new JMenuItem("Status");
addMenuItemListeners(menuItem);
_clickMenu.add(menuItem);
}
private JMenu generateConnectionMenu()
{
JMenu menu = new JMenu("Connect");
List<Port> portList = _database.getAllPortsInCard(_cardId);
for(int i = 0; i < portList.size(); i++)
{
menu.add(new JMenuItem(portList.get(i).getName()));
}
return menu;
}
代码肯定不是最漂亮的,但是对我来说很容易,因为在我试图弄清楚为什么这不起作用的时候,它已被改变了太多次。我认为这可能是范围问题,但我尝试了一些不同的代码配置无济于事。随意提出任何后续问题或打扰我明显的疏忽(它发生在......之前)。谢谢大家!
修改
粉笔这个由于缺乏Java和Swing的经验...我手动定位并使JPopupMenu
可见而不是使用JComponent.setComponentPopupMenu(menu)
方法。在上面的图像(本身是JButton)中为卡模块执行此操作后,子菜单正确显示。下面包含了一个不同的功能版本的初始化代码。
private void initializeMenu()
{
_cardMenu = new JPopupMenu();
JMenu menu = new JMenu("Connect");
JMenuItem menuItem;
menuItem = new JMenuItem("1");
menu.add(menuItem);
menuItem = new JMenuItem("2");
menu.add(menuItem);
_cardMenu.add(menu);
_cardMenu.add(new JMenuItem("Configure"));
_cardMenu.add(new JMenuItem("Status"));
_mainButton.setComponentPopupMenu(_cardMenu); //Important, apparently!
}
所以,经验教训。谢谢你的帮助!
答案 0 :(得分:2)
这是common Bug或Swing属性,在一瞬间只能看到一个Lightweight
弹出窗口,同样的问题是例如使用JComboBox added into JPopupMenu的弹出窗口,
Lightweight
属性更改为Heavyweight
更好的是
JDialog
或JOptionPane
与JComponents
编辑@trashgod
码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class ContextMenu implements ActionListener, MenuListener, MenuKeyListener {
private JTextArea textArea = new JTextArea();
public ContextMenu() {
final JPopupMenu contextMenu = new JPopupMenu("Edit");
JMenu menu = new JMenu("Sub Menu");
menu.add(makeMenuItem("Sub Menu Save"));
menu.add(makeMenuItem("Sub Menu Save As"));
menu.add(makeMenuItem("Sub Menu Close"));
menu.addMenuListener(this);
JMenu menu1 = new JMenu("Sub Menu");
menu1.add(makeMenuItem("Deepest Sub Menu Save"));
menu1.add(makeMenuItem("Deepest Sub Menu Save As"));
menu1.add(makeMenuItem("Deepest Sub Menu Close"));
menu.add(menu1);
menu1.addMenuListener(this);
contextMenu.add(menu);
contextMenu.add(makeMenuItem("Plain Save"));
contextMenu.add(makeMenuItem("Plain Save As"));
contextMenu.add(makeMenuItem("Plain Close"));
contextMenu.addMenuKeyListener(this);
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
frame.add(panel);
panel.setComponentPopupMenu(contextMenu);
textArea.setInheritsPopupMenu(true);
panel.add(BorderLayout.CENTER, textArea);
JTextField textField = new JTextField();
textField.setInheritsPopupMenu(true);
panel.add(BorderLayout.SOUTH, textField);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
textArea.append(e.getActionCommand() + "\n");
}
private JMenuItem makeMenuItem(String label) {
JMenuItem item = new JMenuItem(label);
item.addActionListener(this);
return item;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ContextMenu contextMenu = new ContextMenu();
}
});
}
public void menuSelected(MenuEvent e) {
textArea.append("menuSelected" + "\n");
}
public void menuDeselected(MenuEvent e) {
textArea.append("menuDeselected" + "\n");
}
public void menuCanceled(MenuEvent e) {
textArea.append("menuCanceled" + "\n");
}
public void menuKeyTyped(MenuKeyEvent e) {
textArea.append("menuKeyTyped" + "\n");
}
public void menuKeyPressed(MenuKeyEvent e) {
textArea.append("menuKeyPressed" + "\n");
}
public void menuKeyReleased(MenuKeyEvent e) {
textArea.append("menuKeyReleased" + "\n");
}
}
答案 1 :(得分:2)
我没有在所显示的代码中看到明显的问题,尽管@ mKorbel的观点可能适用。作为参考,此ControlPanel
会为subMenu
添加多个项目。