【问题标题】:An efficient way of adding JMenuItems添加 JMenuItems 的有效方法
【发布时间】:2011-02-02 17:58:42
【问题描述】:

好的,所以在我的 INV 程序是删除菜单项之前,但后来我都喜欢.. 这太多了。那么,如果我要为特定的右键单击项目添加菜单项而不是每次都删除呢?

因此,如果您右键单击项目 1,您会在菜单中添加“使用”和“丢弃”。然后,一旦您选择了选项,JMenu 就会删除所有内容,因此它就在我们开始的地方。然后,如果您右键单击第 2 项,它会添加“使用”和“取消”。看看我要去哪里?

我自己尝试过,但我就是不知道怎么做——例如,要添加一个新的 JMenuItem,你需要这样做:

popup.add(item = new JMenuItem("Cancel"));
item.addActionListener(menuListener);

并且,如您所见,添加一个动作监听器。在if (actItemx == "Item 1") { 下我不能这样做,所以......我该怎么办?

无论如何,这是我目前所拥有的:

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;

public class inv extends JApplet implements MouseListener
{
    public JList listbox;
    public JPopupMenu popup;
    public JMenuItem item;

    public void init()
    {
        ActionListener menuListener = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                String invAction = event.getActionCommand();


                int itemSelect = listbox.getSelectedIndex();
                Object actItem = listbox.getModel().getElementAt(itemSelect);

                System.out.println("Popup menu item [" + invAction + "] [ " + actItem + " ] was pressed.");
            }
        };

        popup = new JPopupMenu();

        popup.add(item = new JMenuItem("Use"));
        item.addActionListener(menuListener);

        popup.add(item = new JMenuItem("Drop"));
        item.addActionListener(menuListener);

        popup.add(item = new JMenuItem("Cancel"));
        item.addActionListener(menuListener);



        String listData[] =
        {
            "Item 1","Item 2","Item 3","Item 4"
        };

        listbox = new JList( listData );
        listbox.addMouseListener( new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                if ( SwingUtilities.isRightMouseButton(e) )
                {
                    System.out.println("Row: " + getRow(e.getPoint()));
                    listbox.setSelectedIndex(getRow(e.getPoint()));
                }
            }
        }
        );

        listbox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        add(listbox);
        listbox.setVisible(true);
        listbox.setFocusable(false);


        listbox.addMouseListener(new MousePopupListener());
    }

    class MousePopupListener extends MouseAdapter
    {
        public void mousePressed(MouseEvent e)
        {
            checkPopup(e);
        }

        public void mouseClicked(MouseEvent e)
        {
            checkPopup(e);
        }

        public void mouseReleased(MouseEvent e)
        {
            checkPopup(e);
        }

        private void checkPopup(MouseEvent e)
        {
            if (e.isPopupTrigger())
            {

                int itemSelectx = listbox.getSelectedIndex();
                Object actItemx = listbox.getModel().getElementAt(itemSelectx);
                System.out.println("You pressed on " + actItemx);

            if (actItemx == "Item 1") {
                System.out.println("Removed cancel for " + actItemx);
                popup.remove(itemSelectx); // So upon right-click on Item 1, you won't see "Cancel" menu.
            }

                popup.show(inv.this, e.getX(), e.getY());
                popup.revalidate();
            }
        }
    }

    private int getRow(Point point)
    {
        return listbox.locationToIndex(point);
    }

    public void mouseEntered(MouseEvent e)
    {
    }

    public void mouseReleased(MouseEvent e)
    {
    }

    public void mousePressed(MouseEvent e)
    {
    }

    public void mouseClicked(MouseEvent e)
    {
    }

    public void mouseExited(MouseEvent e)
    {
    }
}

【问题讨论】:

    标签: java swing jpopupmenu jmenuitem


    【解决方案1】:

    如何为每种类型的项目设置不同的 JPopup 菜单。我的意思是你有这样的东西:

    public JPopupMenu useDropPopup;
    public JPopupMenu useCancelPopup;
    
    public void init() {
       ActionListener menuListener = new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {
                    String invAction = event.getActionCommand();
    
    
                    int itemSelect = listbox.getSelectedIndex();
                    Object actItem = listbox.getModel().getElementAt(itemSelect);
    
                    System.out.println("Popup menu item [" + invAction + "] [ " + actItem + " ] was pressed.");
                }
            };
    
       useDropPopup = new JPopupMenu();
       useCancelPopup = new JPopupMenu();
    
       JMenuItem useMenuItem = new JMenuItem("Use");
       useMenuItem.addActionListener(menuListener);
       JMenuItem dropMenuItem = new JMenuItem("Drop");
       dropMenuItem.addActionListener(menuListener);
       JMenuItem cancelMenuItem = new JMenuItem("Cancel");
       cancelMenuItem.addActionListener(menuListener);
    
       useDropPopup.add(useMenuItem);
       useDropPopup.add(dropMenuItem);
    
       useCancelPopup.add(useMenuItem);
       useCancelPopup.add(cancelMenuItem);
    
       // ... etc bring up the appropriate popup depending on the item.
    }
    

    此外,您不应将 JMenuItem 分配给方法调用内部的项目。这是不好的做法。还可以考虑为每个菜单项使用不同的动作侦听器,以便您可以分离每个菜单项的功能代码,例如:

    useMenuItem.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent event) {
          useMenuAction(event);
       }
    };
    
    // ... after the init method
    
    public void useMenuAction(ActionEvent evt) {
       // Add specific use menu code here.
    }
    

    【讨论】:

      【解决方案2】:

      这主要是对 jluzwick 答案的补充:

      您可以使用Action,而不是创建JMenuItem 并向其添加ActionListener - 这基本上是ActionListener 与名称、可选的Icon 和其他一些属性的组合。 (最简单地从 AbstractAction 扩展,覆盖 actionPerformed-Method。)

      然后将 Action 添加到您的 JMenu,它将自己构建 JMenuItem。 (您也可以在其他地方使用相同的 Action 对象,例如 Buttons、“普通”菜单栏等)

      【讨论】:

        猜你喜欢
        • 2015-01-31
        • 2018-09-11
        • 2019-06-01
        • 1970-01-01
        • 2020-06-23
        • 2011-09-05
        • 2020-06-23
        • 2017-06-12
        • 2019-05-27
        相关资源
        最近更新 更多