MouseListener给出了show()方法的问题

时间:2012-10-31 15:19:46

标签: java swing jtable illegalstateexception jpopupmenu

当用户右键单击我的应用程序中的表行时,我想显示一个小的上下文菜单。我的计划是使用自定义MouseListener来调用show()方法。这是我的代码:

import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

class TableMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
    JTable table = (JTable)(e.getSource());
    Point p = e.getPoint();
    int row = table.rowAtPoint(p);
    int col = table.columnAtPoint(p);

// The autoscroller can generate drag events outside the Tables range.
if ((col == -1) || (row == -1)) {
        return;
}

    if (SwingUtilities.isRightMouseButton(e)) {
        JPopupMenu pop = new JPopupMenu("Row "+row);
        JMenuItem menu1 = new JMenuItem("Wijzigen");
        menu1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                //do things, still have to make that
            }
        });
        pop.show(menu1, p.x, p.y);

    }
}
}

现在我的问题是:当我运行我的应用程序时,我右键单击一个表行,它会弹出这个错误:

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Unknown Source)
at java.awt.Component.getLocationOnScreen(Unknown Source)
at javax.swing.JPopupMenu.show(Unknown Source)
at TableMouseListener.mousePressed(TableMouseListener.java:34)

这到底出了什么问题?

2 个答案:

答案 0 :(得分:4)

您正在尝试相对于JMenuItem(menu1)组件显示JPopupMenu(pop)。但是当你调用popupmenu show方法并且无法确定屏幕上的JMenuItem位置时,JMenuItem是不可见的(当然,它还没有在屏幕上显示)。

您必须在popupmenu show方法中使用一些可见组件作为第一个参数(例如,添加到显示框架或任何其他实际可见组件的某个按钮)。您也可以传递null以将弹出菜单相对于(0; 0)坐标(左上角屏幕)放置。

答案 1 :(得分:2)

  • JMenuItem未添加到JPopup,然后JMenuItem未被isDisplayable

  • 准备这个容器,不要在飞行中创建,

  • 创建整个弹出容器作为局部变量或从类返回,void,无论

    a)准备JMenuItems

    b)覆盖maybeShowPopup,然后在那里你可以管理任何事情(必须在EDT上完成)

  • rest of importantn methods