首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPopupMenu行为

JPopupMenu行为
EN

Stack Overflow用户
提问于 2009-09-30 15:16:22
回答 3查看 3.8K关注 0票数 2

下面我准备了一个小的测试用例。我的问题是当我右击窗口的时候。JPopupMenu会显示,但如果我在JWindow菜单之外的任何地方单击,它都不会消失。我必须单击窗口上的某个地方才能摆脱它,这不是预期的行为。

编辑:在阅读了akf的答案后,我切换到JFrame,当框架在焦点上,弹出菜单显示当你点击另一个窗口时它就消失了。但是,如果窗口没有焦点,而您在某个地方单击,则菜单不会消失。

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class test {

    static class window extends JWindow
    implements MouseListener, MouseMotionListener{

    JPopupMenu popMenu;
    JPanel panel = new JPanel();

    Point location;
    MouseEvent pressed;

    public window(){

        addMouseListener( this );
        addMouseMotionListener( this );

        JLabel label = new JLabel("JWindow", JLabel.CENTER);

        initPopMenu();
        add(label);
        setVisible(true);
        setAlwaysOnTop(true);
        setLocationRelativeTo(null);
        pack();
    }

    public void initPopMenu(){
        popMenu = new JPopupMenu();
        JMenuItem item;

        item = new JMenuItem( "Title" );
        item.setEnabled(false);
        popMenu.add(item);
        popMenu.addSeparator();

        item = new JMenuItem( "Item One" );
        popMenu.add(item);

        item = new JMenuItem( "Item 2" );
        popMenu.add(item);

        item = new JMenuItem( "Item 3" );
        popMenu.add(item);
    }

    public void mousePressed(MouseEvent e)
    {
        pressed = e;
        int nModifier = e.getModifiers();
        if (((nModifier & InputEvent.BUTTON2_MASK) != 0)||
        ((nModifier & InputEvent.BUTTON3_MASK) != 0))
        popMenu.show( this, e.getX(), e.getY() );
    }

    public void mouseClicked(MouseEvent e) {
    }


    public void mouseReleased(MouseEvent e) {}

    public void mouseDragged(MouseEvent me){
    }

    public void mouseMoved(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    }
    public static void main(String[] args) {
    window dw = new window();
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-18 00:52:30

看看JWindow.isFocusableWindow的Java Doc JWindow不能成为焦点窗口,除非它有一个所有者并且该所有者是可见的。您使用的是默认构造函数,因此您的JWindow具有共享所有者asn是不可聚焦的。当它不可聚焦时,当您单击其他地方时,它无法检测到焦点的丢失。

我将JWindow更改为JFrame,并在调用setUndecorated(true);之前添加了对setVisible的调用,这对我很有效。如果这些更改不能使其对您起作用,请发布您正在使用的Java版本:java -fullversion

票数 1
EN

Stack Overflow用户

发布于 2009-09-30 15:53:30

在Windows上的Java 6中,我甚至无法使用您提供的代码显示弹出窗口。另一方面,如果我将您的超类更改为JFrame,它将按预期工作,当我在窗口外单击时,弹出窗口将消失。为什么你使用JWindow而不是JFrame作为你的超类?如果你希望有一个无边框/无标题的窗口,你可以在你的JFrame上调用setUndecorated(true) (当然,在你设置visible和pack之前)。

票数 0
EN

Stack Overflow用户

发布于 2009-09-30 16:47:41

如果菜单在MouseExited方法中是可见的,那么如何隐藏菜单呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1498789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档