Domanda

Ok, quindi prima che il mio programma INV fosse rimuovere le voci di menu ma poi ero tutto come ... è troppo. E se dovessi aggiungere voci di menu per elementi specifici per fare clic con il pulsante destro del mouse invece di rimuovere ogni volta?

Quindi, se hai fatto clic con il pulsante destro del mouse sull'elemento 1, otterrai "usi" e "drop" aggiunto al menu. Quindi, una volta scelto la tua opzione, JMenu eliminerebbe tutto, quindi sarebbe proprio dove abbiamo iniziato. Quindi se si faceva clic con il pulsante destro del mouse sull'articolo 2, aggiungerebbe "uso" e "annulla". Vedi dove sto andando?

Ho provato a farlo da solo, ma non riesco proprio a capire come farlo - per esempio, per aggiungere un nuovo jmenuitem, devi farlo:

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

E, come puoi vedere, aggiungi un listener. Non posso farlo sotto if (actItemx == "Item 1") { Allora ... cosa devo fare?

Comunque, ecco cosa ho finora:

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)
    {
    }
}
È stato utile?

Soluzione

Che ne dici di impostare diversi menu jpopup per ogni tipo di elemento. Quello che voglio dire è che tu abbia qualcosa che assomiglia a questo:

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

Inoltre, non è necessario assegnare un JMENUITEM all'articolo all'interno di una chiamata del metodo. È una cattiva pratica. Considera anche l'utilizzo di diversi Listeners per ciascuna voce di menu in modo da poter separare il codice funzionale di ciascuna voce di menu, 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.
}

Altri suggerimenti

Questa è principalmente un'aggiunta alla risposta di Jluzwick:

Invece di creare un JmenuitEm e aggiungere un listener, puoi usare un'azione: questa è fondamentalmente una combinazione di un listener di azioni con un nome, opzionale icona e altre proprietà. (La maggior parte si estende dall'astrattazione, sovrascrivendo il metodo ActionPerformed.)

Quindi aggiungi l'azione al tuo JMenu e costruirà il jmenuuitem stesso. (Puoi anche usare lo stesso oggetto di azione in altri luoghi, come pulsanti, la barra del menu "normale", ecc.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top