0

さて、私のINVプログラムがメニュー項目を削除する前に、私はすべてのようでした..それは多すぎます。では、毎回削除するのではなく、特定の右クリック項目のメニュー項目を追加するとどうなりますか?

したがって、項目1を右クリックすると、メニューに「使用」と「ドロップ」が追加されます。次に、オプションを選択すると、JMenuはすべてを削除するので、開始した場所に正しくなります。次に、ITem 2を右クリックすると、「使用」と「キャンセル」が追加されます。私がどこに行くのか分かりますか?

自分でやってみましたが、どうすればいいのかわかりません。たとえば、新しいJMenuItemを追加するには、次のようにする必要があります。

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

ご覧のとおり、アクションリスナーを追加します。私はそれを下で行うことができない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)
    {
    }
}
4

2 に答える 2

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を割り当てないでください。それは悪い習慣です。また、メニュー項目ごとに異なるアクションリスナーを使用して、各メニュー項目の機能コードを分離できるようにすることも検討してください。例:

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.
}
于 2011-02-02T18:57:45.220 に答える
0

これは主にjluzwickからの回答への追加です:

JMenuItemを作成してそれにActionListenerを追加する代わりに、Actionを使用できます。これは基本的にActionListenerと名前、オプションでIconおよびその他のプロパティの組み合わせです。(ほとんどの場合、AbstractActionから拡張し、actionPerformed-Methodをオーバーライドします。)

次に、アクションをJMenuに追加すると、JMenuItem自体が作成されます。(ボタン、「通常の」メニューバーなど、他の場所でも同じActionオブジェクトを使用できます。)

于 2011-02-02T20:23:13.073 に答える