Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取JPOppMenu对象的左上角位置_Java_Swing_Jpopupmenu - Fatal编程技术网

Java 获取JPOppMenu对象的左上角位置

Java 获取JPOppMenu对象的左上角位置,java,swing,jpopupmenu,Java,Swing,Jpopupmenu,我有一个JPOppMenu对象。它的行为取决于它的坐标。 如何获取其相对于其父容器的位置?在您的MouseListener方法(MouseRelease等)中,您应该收到一个包含当前位置的MouseEvent对象。如果不想使用这些值,可以尝试使用该方法,否则返回绝对位置,则需要计算相对位置。有一个解决方案,但不建议使用,因为如果有SecurityManager,它可能会失败(强制访问该字段): 由于或方法对我都不起作用,并且字段desiredLocationX/desiredLocationY不

我有一个JPOppMenu对象。它的行为取决于它的坐标。
如何获取其相对于其父容器的位置?

在您的
MouseListener
方法(MouseRelease等)中,您应该收到一个包含当前位置的
MouseEvent
对象。如果不想使用这些值,可以尝试使用该方法,否则返回绝对位置,则需要计算相对位置。

有一个解决方案,但不建议使用,因为如果有SecurityManager,它可能会失败(强制访问该字段):

由于或方法对我都不起作用,并且字段
desiredLocationX
/
desiredLocationY
不可访问,因此我扩展了JPopupMenu(),如下所示:

contextMenu = new JPopupMenu(){
    private Point desiredLocation;

    /**
    * Override Component#getLocation, since it always returns 0,0.
    */
    @Override
    public Point getLocation() {
        return desiredLocation;
    }

    @Override
    public void show(Component invoker, int x, int y) {
        desiredLocation = new Point(x, y);
        super.show(invoker, x, y);
    }
};

它返回x=0和y=0。在调试期间,我注意到只有私有字段desiredLocation存储了所需的值。“但我还不知道如何访问它。”“安德烈,你是怎么把它显示出来的?”?你应该有一些代码在正确的位置显示菜单,对吗?有一个JPanel,它处理右键单击并显示这个弹出菜单。@Andrei我想你的JPanel有一个鼠标听写器。在MouseListener的方法(MouseRelease等)中,应接收包含当前位置的MouseEvent对象。你没有在那个位置上显示JPOPUPMENUS吗?是的,但是我想只使用对弹出菜单对象的引用来检索位置。为了更快地获得更好的帮助,请发布一个。
contextMenu = new JPopupMenu(){
    private Point desiredLocation;

    /**
    * Override Component#getLocation, since it always returns 0,0.
    */
    @Override
    public Point getLocation() {
        return desiredLocation;
    }

    @Override
    public void show(Component invoker, int x, int y) {
        desiredLocation = new Point(x, y);
        super.show(invoker, x, y);
    }
};