代码之家  ›  专栏  ›  技术社区  ›  user2211678

jMenuItem.addMouseListener(this)出错

  •  0
  • user2211678  · 技术社区  · 10 年前

    我尝试在JMenuItems中添加一个actionlistener,以便右键单击。 我看到了许多示例,它们使用item.addActionListener(this)向JMenuItem添加监听器

     JMenuItem item;
     item.addActionListener(this);
    

    但不管怎样,我试过了,我还是犯了错误

     the method addActionListener(ActionListener) in the type AbstractButton is not 
     applicable for the arguements (PopUpMenuExample)
    

    error

    密码

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.border.BevelBorder;
    import javax.swing.event.PopupMenuEvent;
    import javax.swing.event.PopupMenuListener;
    
    public class PopUpMenuExample extends JPanel {
    
      public JPopupMenu popup;
    
      public PopUpMenuExample() {
          popup = new JPopupMenu();
    
         JMenuItem item;
         popup.add(item = new JMenuItem("Add"));
         item.setHorizontalTextPosition(JMenuItem.RIGHT);
         item.addActionListener(this); <-- error!
    
         popup.add(item = new JMenuItem("Delete"));
         item.setHorizontalTextPosition(JMenuItem.RIGHT);
         item.addActionListener(this); <-- error!
    
         popup.setLabel("Justification");
         popup.setBorder(new BevelBorder(BevelBorder.RAISED));
         popup.addPopupMenuListener(new PopupPrintListener());
    
         addMouseListener(new MousePopupListener());
      }
    
      // An inner class to check whether mouse events are the popup trigger
      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()) {
               popup.show(PopUpMenuExample.this, e.getX(), e.getY());
           }
        }
      }
    
      public static void main(String s[]) {
         JFrame frame = new JFrame("Popup Menu Example");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setContentPane(new PopUpMenuExample());
         frame.setSize(300, 300);
         frame.setVisible(true);
      }
    }
    

    已编辑(在JPopUpMenu中添加JMenuitem)

    table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                if (e.getButton() == java.awt.event.MouseEvent.BUTTON3) {
                    System.out.println("Right Click");
                    int r = table.rowAtPoint(e.getPoint());
                    if (r >= 0 && r < table.getRowCount()) {
                        table.setRowSelectionInterval(r, r);
    
                    } else {
                        table.clearSelection();
                    }
    
                    int rowindex = table.getSelectedRow();
                    if (rowindex < 0)
                        return;
                    if (e.isPopupTrigger() && e.getComponent() instanceof JTable ) {
                        JPopupMenu popup = new JPopupMenu();
                        JMenuItem item;
                        popup.add(item = new JMenuItem("Add"));
                        item.setHorizontalTextPosition(JMenuItem.RIGHT);
                        item.addMouseListener(this);
                        popup.add(item = new JMenuItem("Delete"));
                        item.setHorizontalTextPosition(JMenuItem.RIGHT);;
                        popup.setComponentPopupMenu(popup);
                        popup.show(e.getComponent(), e.getX(), e.getY());
                    }
                }
            }
    
    2 回复  |  直到 10 年前
        1
  •  4
  •   MadProgrammer    10 年前

    this 是一个 JPanel 它没有实现 ActionListener ...

    看看 How to Write an Action Listeners How to Use Menus 你也可以和我一起 How to Use Actions

    您也可以使用 JComponent#setComponentPopupMenu 而不是使用 MouseListener 您应该确保您是在事件调度线程的上下文中构建UI,请查看 Initial Threads 有关详细信息

    弹出菜单示例

    对我来说很好。。。

    JTable table = new JTable(model);
    
    JPopupMenu popupMenu = new JPopupMenu();
    JMenuItem mi = popupMenu.add("Boo!");
    mi.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Ah, a ghost!");
        }
    });
    table.setComponentPopupMenu(popupMenu);
    
        2
  •  1
  •   Jens    10 年前

    您必须添加 implement ActionListener 并实施该方法 actionPerform

    public class PopUpMenuExample extends JPanel implements ActionListener
    
    推荐文章