gpt4 book ai didi

java - JList 上的 AWT-EventQueue-1

转载 作者:行者123 更新时间:2023-12-02 00:46:32 25 4
gpt4 key购买 nike

我终于得到了正确编译的代码。不过,有一个可能。我设置了列表框来添加鼠标监听器,但我收到了一个巨大的错误:

我主要将其添加到代码中: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 的本地实例。结果是类级别的 popup 永远不会设置为任何内容,并且当您尝试在 checkPopup 中使用它时会导致 NPE。更改线路:

JPopupMenu popup = new JPopupMenu();

popup = new JPopupMenu();

应该可以解决这个问题。

关于java - JList 上的 AWT-EventQueue-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4870706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com