java - JPopupMenu 行为

标签 java swing jpopupmenu

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

编辑: 阅读 akf 的回答后,我切换到 JFrame,当框架处于焦点状态并且弹出菜单显示它在您单击另一个窗口时消失。但是如果窗口没有焦点并且您单击某处菜单不会消失。


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();
    }
}

最佳答案

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

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

关于java - JPopupMenu 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1498789/

相关文章:

java - 我想在 Android Activity 中制作一个可滚动的带有图像的文本列表。我应该用什么?

java - 如何实现通用计算器类

Java Swing 日历或组织器

java - jPopUpMenu 更改鼠标悬停背景

java - 如何创建带有菜单的 JButton?

java - 更改组合框起点

java - 导入项目到eclipse

java - 在 Eclipse 中更改方法签名时如何自动更新 Javadoc?

java - 商业或开源 Java Swing 规则/谓词编辑器小部件?

java - Gridbaglayout 不显示任何内容! java