【问题标题】:Exception in Thread "AWT-EventQueue-1"线程“AWT-EventQueue-1”中的异常
【发布时间】:2011-02-02 20:56:48
【问题描述】:

我会让这个变得又快又简单。

我收到 NPE 错误...

Row: 0
You pressed on Item 1
Removed cancel for Item 1
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
        at inv$MousePopupListener.checkPopup(inv.java:118)
        at inv$MousePopupListener.mouseReleased(inv.java:104)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:2
73)
        at java.awt.Component.processMouseEvent(Component.java:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

我搜索了高低,我不知道如何解决它:

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 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);


        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());

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



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

【问题讨论】:

    标签: java swing nullpointerexception


    【解决方案1】:

    学习阅读您​​的堆栈跟踪:

    Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
            at inv$MousePopupListener.checkPopup(inv.java:118)
            at inv$MousePopupListener.mouseReleased(inv.java:104)
            at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:2
    73)
    

    它说,第 118 行有一个 NullPointerException

    ...checkPopup(inv.java:118)....
    

    这又被第 104 行调用:

    ... useReleased(inv.java:104).. 
    

    如果您看到这些行,您将拥有:

    如您所见,在该行中您正在调用:

    popup.remove(itemSelectx);
    

    该行可能引发 NullPointerException 的唯一方法是 popup 为 null,因为 null.remove.. 引发 NullPointerException。

    因此,将您的弹出窗口初始化为有意义的内容。

    我希望这对您将来的例外情况有所帮助。

    【讨论】:

      【解决方案2】:

      我在这段代码的任何地方都没有看到对popup 的赋值,所以它的默认值总是null

      你忘了说

      popup = useDropPopup;
      

      popup = useCancelPopup;
      

      或许

      popup = new JPopupMenu();
      

      某处?否则这个例程根本不知道你在说什么popup

      此外,由于您正在通过删除一个项目来改变 popup,因此请注意它是新创建/复制的 JPopupMenu,或者您将删除的项目放回原处,以备不时之需。

      【讨论】:

        【解决方案3】:

        我认为 JPopUpMenu 弹出窗口是 null,您必须使用以下方法对其进行初始化:

        popup = new JPopUpMenu();
        

        或将其分配给您定义的其他弹出窗口之一...异常足够明确,它甚至会告诉您哪一行包含有问题的代码!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-02
          • 2012-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多