2011-02-02 1 views
0

Хорошо, поэтому перед тем, как моя программа INV должна была УДАЛИТЬ пункты меню, но тогда все было похоже ... это слишком много. Итак, что делать, если я должен добавлять пункты меню для конкретных элементов с щелчком правой кнопкой мыши в INSTEAD для удаления каждый раз?Эффективный способ добавления JMenuItems

Итак, если вы щелкнули правой кнопкой по пункту 1, вы получите «Use» и «Drop», добавленные в меню. Затем, когда вы выбираете свой вариант, JMenu удалит все, чтобы было правильно, где мы начали. Затем, если вы щелкнули правой кнопкой мыши на ITem 2, это добавит «Использовать» и «Отменить». Смотрите, куда я иду?

Я пытался делать это сам, но я просто не могу понять, как это сделать - например, чтобы добавить новый JMenuItem, что вам нужно сделать это:

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

ответ

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 к пункту внутри вызова метода. Это плохая практика. Также рекомендуется использовать различные actionlisteners для каждого пункта меню, так что вы можете отделить функциональный код каждого пункта меню, например:

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. 
} 
+0

Это не работает для меня, я отправлю новое сообщение Q – nn2

0

В основном это дополнение к ответу от jluzwick:

Вместо создания JMenuItem и добавив к нему ActionListener, вы можете использовать Action - это в основном комбинация ActionListener с именем, необязательным значком и некоторыми другими свойствами. (Просто просто простирайтесь от AbstractAction, переопределяя actionPerformed-Method.)

Затем добавьте действие к вашему JMenu, и оно построит сам JMenuItem. (Вы также можете использовать один и тот же объект Action в других местах, например, кнопки, «нормальную» строку меню и т. Д.)

 Смежные вопросы

  • Нет связанных вопросов^_^