栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从JButton显示/隐藏JPopupMenu;FocusListener无法正常工作?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从JButton显示/隐藏JPopupMenu;FocusListener无法正常工作?

这是另一种方法,即使不是很优雅,也算是不错的,据我所知,它是可行的。首先,在最顶部,我添加了一个名为的第二个布尔值

showPopup

FocusListener
必须如下:

    menu.addFocusListener(new FocusListener() {        @Override        public void focusLost(FocusEvent e) { System.out.println("LOST FOCUS"); isShowingPopup = false;        }        @Override        public void focusGained(FocusEvent e) { System.out.println("GAINED FOCUS"); isShowingPopup = true;        }    });

isShowingPopup
布尔没有得到改变其他地方-如果它获得焦点,它假定它表示,如果它失去焦点,它假定它不是。

接下来,

ActionListener
按钮上的有所不同:

   addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) { System.out.println("isShowingPopup: " + isShowingPopup); if (showPopup) {     Component c = (Component) e.getSource();     menu.show(c, -1, c.getHeight());     menu.requestFocus(); } else {     showPopup = true; }        }    });

现在出现了真正的新东西。这是一个

MouseListener
按钮:

    addMouseListener(new MouseAdapter() {        @Override        public void mousePressed(MouseEvent e) { System.out.println("ispopup?: " + isShowingPopup); if (isShowingPopup) {     showPopup = false; }        }        @Override        public void mouseReleased(MouseEvent e) { showPopup = true;        }    });

基本上,

mousePressed
在菜单失去焦点之前被调用,因此
isShowingPopup
反映了是否在按下按钮之前显示了弹出窗口。然后,如果菜单在那里,我们将其设置
showPopup
false
,这样该
actionPerformed
方法在调用菜单后(放开鼠标后)就不会显示菜单。

在每种情况下,它的行为均符合预期,但只有一种:如果显示菜单,并且用户在按钮上按下鼠标但将其释放到按钮外,

actionPerformed
则永远不会调用。这意味着它
showPopup
仍然为假,并且下次按下该按钮时不会显示菜单。要解决此问题,
mouseReleased
方法将重置
showPopup
。据我所知,该
mouseReleased
方法在after之后被调用
actionPerformed

我在结果按钮上玩了一点,对按钮做了所有我想得到的事情,并且按预期工作。但是,我不是100%肯定事件将始终以相同的顺序发生。

最终,我认为这至少值得一试。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/515832.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号