首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未触发JPopupMenu动作

未触发JPopupMenu动作
EN

Stack Overflow用户
提问于 2016-04-26 09:44:12
回答 1查看 372关注 0票数 3

这是我所拥有的(一种标准化的)版本。(我是这样找到代码的):

代码语言:javascript
复制
class CustomPopup extends JPopupMenu {
    public CustomPopup() {}

    @Override
    public void setVisible(boolean visible)
    {
        // Case 1:
        //if (visible) super.setVisible(visible);
        // Case 2:
        super.setVisible(visible);
    }
}

class CustomPanel extends JPanel {
    // .../...
    public CustomPanel() {
        setSize(200, 200);
        addMouseListener( new MouseAdapter(){
            @Override
            public void mousePressed( MouseEvent e ){
                onMousePressed( e );
            }
        });

    }

    public void onMousePressed( MouseEvent e )
    {
        JPopupMenu pop = new JPopupMenu();

        pop.add( new AbstractAction( "foo" )
        {
            @Override
            public void actionPerformed( ActionEvent e )
            {
                // do stuff
                System.out.println("this is executed");
            }
        });
        pop.show( e.getComponent(), e.getX(), e.getY() );
    }
}

public class TestPopup extends JFrame {
    CustomPanel _pp;
    CustomPopup _cpop;

    public TestPopup () {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(333, 333);
        _cpop = new CustomPopup();
        _pp = new CustomPanel();
        _cpop.add(_pp);

        addMouseListener( new MouseAdapter(){
            @Override
            public void mousePressed( MouseEvent e ){
                _cpop.show(e.getComponent(), 0, 0);
            }
        });
    }
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                (new TestPopup()).setVisible(true);
            }
        });
    }
}

弹出菜单显示自定义面板。当与它交互时,它会显示一个经典的弹出式菜单和一个选项列表。

我的问题是,CustomPopup并没有像它应该关闭的那样关闭自己。罪魁祸首显然是setVisible的重写,但是如果删除重写方法(或注释掉条件),我还有另一个问题:从未调用在pop上添加的actionPerformed方法。

在第一种情况下:

  1. CustomPopup打开
  2. 我点击里面的东西
  3. JPopupMenu打开,仍然是可见的
  4. 我点击新菜单的一个项目。
  5. Action被触发

在第二种情况下:

  1. CustomPopup打开
  2. 我点击里面的东西
  3. JPopupMenu打开,是隐藏的
  4. 我点击新菜单的一个项目。
  5. Action是由而非触发的

我的结论是,CustomPopup必须是可见的,才能触发动作,即使我并不真正理解其中的原因。因此,我的问题是:如何以不破坏默认CustomPopup行为的方式保持JPopupMenu打开,或者如何通过隐藏CustomPopup使操作触发正常?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-29 07:25:35

看起来弹出式弹出的父母必须是可见的行动触发(听起来对我来说是合理的)。所以,除了最后一步:自己关闭自定义弹出窗口之外,您已经做了所有的工作。以下是代码:

代码语言:javascript
复制
class CustomPopup extends JPopupMenu {
    public CustomPopup() {}

    @Override
    public void setVisible(boolean visible)
    {
        // Case 1:
        if (visible) super.setVisible(visible);
        // Case 2:
//        super.setVisible(visible);
    }
    public void makeInvisible() {
        super.setVisible(false);
    }
}

class CustomPanel extends JPanel {
    // .../...
    public CustomPanel() {
        setSize(200, 200);
        addMouseListener( new MouseAdapter(){
            @Override
            public void mousePressed( MouseEvent e ){
                onMousePressed( e );
            }
        });

    }

    public void onMousePressed( MouseEvent e )
    {
        JPopupMenu pop = new JPopupMenu();

        pop.add( new AbstractAction( "foo" )
        {
            @Override
            public void actionPerformed( ActionEvent e )
            {
                // do stuff
                System.out.println("this is executed");
                Component comp = (Component) e.getSource();
                if (comp != null && comp.getParent() instanceof JPopupMenu) {
                    JPopupMenu popupMenu = (JPopupMenu) comp.getParent();
                    if (popupMenu.getInvoker() instanceof CustomPanel) {
                        CustomPopup cpop = (CustomPopup) popupMenu.getInvoker().getParent();
                        cpop.makeInvisible();
                    }
                }
            }
        });
        pop.show( e.getComponent(), e.getX(), e.getY() );
    }
}

public class TestPopup extends JFrame {
    CustomPanel _pp;
    CustomPopup _cpop;

    public TestPopup () {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(333, 333);
        _cpop = new CustomPopup();
        _pp = new CustomPanel();
        _cpop.add(_pp);

        addMouseListener( new MouseAdapter(){
            @Override
            public void mousePressed( MouseEvent e ){
                _cpop.show(e.getComponent(), e.getX(), e.getY());
            }
        });
    }
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                (new TestPopup()).setVisible(true);
            }
        });
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36861153

复制
相关文章

相似问题

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