Удалить из JMenuItem - PullRequest
       19

Удалить из JMenuItem

1 голос
/ 02 февраля 2011

ОК, так что я наконец-то поболтал с JListMenu, спасибо вам, ребята.Тем не менее, сейчас я пытаюсь сделать так, чтобы элементы SPECIFIC имели команды SPECIFIC.Таким образом, подобно пункту 1 не будет возможности щелкнуть правой кнопкой мыши кнопку Отмена, а элементы 2, пункт 3 и пункт 4 могут.Видите, куда я иду?

Итак, вот мой код:

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

                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)
    {
    }
}

, и это работает!Я имею в виду, щелкните правой кнопкой мыши, и вы увидите вариант, который вы выбрали в каком списке элементов.Однако при щелчке правой кнопкой мыши на элементе меню появляется небольшая предупреждающая метка.Странно.

Anwways, прямо под System.out.println("You pressed on " + actItemx); Я пытался добавить это:

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

, и это, кажется, работает (но это еще не сделано, потому что тогда я должен повторно добавить его, хе).Однако, когда я щелкнул правой кнопкой мыши, Отмена исчезла.Как и ожидалось.Woo!Но потом я снова щелкнул по нему правой кнопкой мыши и получил эту ошибку:

Exception in thread "AWT-EventQueue-1" java.lang.IllegalArgumentException: index
 greater than the number of items.
        at javax.swing.JPopupMenu.remove(JPopupMenu.java:412)
        at inv$MousePopupListener.checkPopup(inv.java:102)
        at inv$MousePopupListener.mouseReleased(inv.java:88)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:2
73)
        at java.awt.Component.processMouseEvent(Component.java:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Ах, хорошо - вернемся к чертежной доске.Что я делаю не так?

1 Ответ

2 голосов
/ 02 февраля 2011

Заменить

popup.remove(2);

на

popup.remove(itemSelectx);
...