簡體   English   中英

JList上的AWT-EventQueue-1

[英]AWT-EventQueue-1 on JList

我終於得到了正確編譯的代碼。 但是,可能有一個。 我將listbox設置為添加一個mouselistener,但全部都得到了一個巨大的錯誤:

我主要將其添加到代碼中: listbox.addMouseListener(new MousePopupListener());

當我運行它時,它可以工作。 但是,當我右鍵單擊JList ,得到以下信息:

Row: 0
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
    at inv$MousePopupListener.checkPopup(inv.java:91)
    at inv$MousePopupListener.mouseReleased(inv.java:84)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
    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(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.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 void init()
{
    ActionListener menuListener = new ActionListener()
    {
        public void actionPerformed(ActionEvent event)
        {
            String invAction = event.getActionCommand();
            System.out.println("Popup menu item [" + invAction + "] was pressed.");
        }
    };

    JPopupMenu popup = new JPopupMenu();

    popup.add(item = new JMenuItem("Use"));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.add(item = new JMenuItem("Drop"));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.add(item = new JMenuItem("Cancel"));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    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())
        {
            popup.show(inv.this, e.getX(), e.getY());
        }
    }
}

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

}

問題是您將popup聲明為類變量,然后在init方法中創建popup的本地實例。 結果是,在嘗試在checkPopup中使用時,類級別彈出窗口永遠不會設置為任何內容,並且會導致NPE。 換行:

JPopupMenu popup = new JPopupMenu();

popup = new JPopupMenu();

應該解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM