Java 添加jmenu项的有效方法
好的,所以在我的投资计划是删除菜单项,但然后我都喜欢。。太过分了。那么,如果我要为特定的右键单击项添加菜单项,而不是每次都删除,该怎么办 因此,如果您右键单击项目1,您将在菜单中添加“使用”和“删除”。然后,一旦您选择了选项,JMenu将删除所有内容,因此它将位于我们开始的位置。然后,如果您右键单击项目2,它将添加“使用”和“取消”。看到我要去哪里了吗 我试着自己做,但我就是不知道怎么做——例如,要添加一个新的JMenuItem,您需要这样做:Java 添加jmenu项的有效方法,java,swing,jpopupmenu,jmenuitem,Java,Swing,Jpopupmenu,Jmenuitem,好的,所以在我的投资计划是删除菜单项,但然后我都喜欢。。太过分了。那么,如果我要为特定的右键单击项添加菜单项,而不是每次都删除,该怎么办 因此,如果您右键单击项目1,您将在菜单中添加“使用”和“删除”。然后,一旦您选择了选项,JMenu将删除所有内容,因此它将位于我们开始的位置。然后,如果您右键单击项目2,它将添加“使用”和“取消”。看到我要去哪里了吗 我试着自己做,但我就是不知道怎么做——例如,要添加一个新的JMenuItem,您需要这样做: popup.add(item = new JMen
popup.add(item = new JMenuItem("Cancel"));
item.addActionListener(menuListener);
如您所见,添加一个actionlistener。在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)
{
}
}
为每种类型的项目设置不同的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.
}
此外,您不应该将JMENUION项分配给方法调用中的项。这是不好的做法。也可以考虑使用每个菜单项的不同ActualListNever,这样您就可以分离每个菜单项的功能代码,EX:
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.
}
这主要是对jluzwick回答的补充: 您可以使用Action,而不是创建JMenuItem并向其添加ActionListener,它基本上是ActionListener与名称、可选图标和一些其他属性的组合(大多数只是从AbstractAction扩展,覆盖actionPerformed方法) 然后将动作添加到JMenu中,它将构造JMenuItem本身(您也可以在其他地方使用相同的动作对象,如按钮、“正常”菜单栏等)