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

JMenuBar SelectionModel ChangeListener仅触发一次

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

JMenuBar SelectionModel ChangeListener仅触发一次

看起来菜单栏一旦被选择就永远不会被取消选择。不确定是否是错误。

直接听MenuSelectionManager可能是一个更好的主意,因为在此通知您任何地方菜单选择的所有更改。需要一些逻辑来过滤掉与menuBar不相关的那些逻辑,类似于:

ChangeListener listener = new ChangeListener() {    @Override    public void stateChanged(ChangeEvent e) {        MenuElement[] elements = MenuSelectionManager.defaultManager().getSelectedPath();        jMenuBar1.setVisible(elements.length > 0 && elements[0] == jMenuBar1);    }};MenuSelectionManager.defaultManager().addChangeListener(listener);

更新资料

隐藏菜单栏的一个巨大缺点是其菜单项的加速器停止工作。原因是仅要求显示的组件的componentInputMaps处理它们。这是在swing包的肠子深处完成的,即由包私有类KeyboardManager进行。无法挂接自定义管理器(可以实现为处理未显示的菜单栏)。

但是,在链的另一端,我们可以进行干预。基本上有两个选项,两个都属于菜单栏:

  • (极其肮脏的把戏!)重写isShowing始终返回true。我已经看过了,但是不能真正推荐,因为 可能 会有一些我不知道的副作用
  • 一个稍微肮脏的技巧:添加一个隐藏的属性,并实现getPreferredSize如果隐藏则返回0高度。肮脏是它依赖RootPaneLayout尊重首选高度…

修改后的ChangeListener:

bar.setHidden(true);ChangeListener listener = new ChangeListener() {    @Override    public void stateChanged(ChangeEvent e) {        MenuElement[] elements = MenuSelectionManager.defaultManager().getSelectedPath();        bar.setHidden(!(elements.length >0 && elements[0] == bar));    }};MenuSelectionManager.defaultManager().addChangeListener(listener);

自定义menuBar:

public static class JHideableMenuBar extends JMenuBar {    private boolean hidden;    public void setHidden(boolean hidden) {        if (this.hidden == hidden) return;        this.hidden = hidden;        revalidate();    }    @Override    public Dimension getPreferredSize() {        Dimension pref = super.getPreferredSize();        if (hidden) { pref.height = 0;        }        return pref;    }}


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

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

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