ОК, поэтому я, наконец, получил JListMenu с благодарностью вам, ребята. Однако теперь я пытаюсь сделать так, чтобы у КОНКРЕТНЫХ элементов были КОНКРЕТНЫЕ команды. Таким образом, как и у элемента 1, у него не будет возможности щелкнуть правой кнопкой мыши Cancel, но пункты 2, 3 и 4 могут. Смотрите, куда я иду?Удалить из JMenuItem
Так вот мой код до сих пор:
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)
{
}
}
и это работает! Я имею в виду, щелкнув правой кнопкой мыши, и вы увидите выбранный вами вариант, в котором список элементов. Однако при щелчке правой кнопкой мыши на элементе меню есть небольшая предупреждающая надпись. Weird.
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.
}
и казалось, на работу (но это еще не сделали, потому что тогда я должен RE добавить его, хех). Однако, когда я щелкнул правой кнопкой мыши, Отмена исчезла. Как и ожидалось. 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)
А, хорошо спиной к чертежной доске. Что я делаю не так?
хорошо, ваша программа работает, как ожидалось. после удаления пункта отмены meu, если вы нажмете «item 1», ваш код попытается удалить снова всплывающее меню с индексом 2 .. Он дает исключение, как ожидалось. –