Не удается добавить JMenuItem в JMenu в JPopupMenu - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть новый пользовательский интерфейс, над которым я работаю над реализацией в Java, и у меня возникают проблемы с реализацией JPopupMenu, содержащего JMenu (а также несколько JMenuItems), который сам содержит несколько JMenuItems. JPopupMenu появляется там, где я нажимаю на RMB, и выглядит хорошо, но у «Connect» у JMenu, кажется, нет детей, когда я нахожу курсор мыши, несмотря на все мои усилия по .add ().
enter image description here

Посмотрев несколько примеров в Интернете, я не увидел ни одного, который бы специально реализовывал прослушиватель для 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!
}

Итак, урок усвоен. Спасибо за помощь, ребята!

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Я не вижу очевидной проблемы в показанном коде, хотя точка @ mKorbel может применяться.Для справки: ControlPanel добавляет subMenu с несколькими элементами.

2 голосов
/ 03 апреля 2012

Это общее свойство Bug или Swing, которое в один момент может быть видно только в одном всплывающем окне Lightweight, такая же проблема, например, с всплывающим окном из JComboBox, добавленным в JPopupMenu ,

  • изменить Lightweight свойство на Heavyweight

лучше будет

  • использовать без декорации JDialog или JOptionPane с JComponents

РЕДАКТИРОВАТЬ @ trashgod

  • все работает так, как я исключил, все JMenus, JMenuItems видны и многократно запускаются правильные сообщения

код

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");
    }
}
...