如何在qx.ui.menu.Menu中用两个div分离按钮、实现滚动并解决子菜单不显示问题
解决方案
核心思路
qx.ui.menu.Menu是弹出式组件,不能直接添加到根容器显示,必须通过setOpener()绑定触发按钮,点击触发按钮或调用open()方法才能正常弹出。- 实现固定按钮+滚动区域的布局:在主菜单内嵌套两个容器,第一个放始终显示的固定按钮,第二个用
qx.ui.container.Scroll容器包裹其余按钮,设置其最大高度为400px,内容超出时自动出现滚动条。
完整代码示例
// 创建主菜单实例 const mainMenu = new qx.ui.menu.Menu(); // 1. 固定按钮容器(始终显示在顶部) const fixedBtnContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox()); fixedBtnContainer.add(new qx.ui.menu.Button("固定显示按钮")); mainMenu.add(fixedBtnContainer); // 2. 滚动区域容器(高度超400px时显示滚动条) const scrollContainer = new qx.ui.container.Scroll(); scrollContainer.setMaxHeight(400); // 滚动区域内的按钮容器 const scrollBtnContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox()); // 添加3-4个需要滚动的按钮 scrollBtnContainer.add(new qx.ui.menu.Button("滚动按钮1")); scrollBtnContainer.add(new qx.ui.menu.Button("滚动按钮2")); scrollBtnContainer.add(new qx.ui.menu.Button("滚动按钮3")); scrollBtnContainer.add(new qx.ui.menu.Button("滚动按钮4")); scrollContainer.setWidget(scrollBtnContainer); mainMenu.add(scrollContainer); // 创建触发菜单的按钮(必须绑定opener才能正常显示菜单) const triggerBtn = new qx.ui.form.Button("点击打开菜单"); triggerBtn.setOpener(mainMenu); // 将触发按钮添加到根容器 const doc = this.getRoot(); doc.add(triggerBtn, { left: 200, top: 50 }); // 测试用:自动打开菜单(可选) // mainMenu.open();
关键说明
- 菜单显示规则:
qx.ui.menu.Menu的设计依赖触发组件(opener),通过setOpener()关联后,点击触发按钮会自动弹出菜单;手动调用open()前也必须先设置opener。 - 滚动区域实现:
qx.ui.container.Scroll容器配合setMaxHeight(400),内部VBox布局的按钮容器在内容高度超出400px时,会自动生成垂直滚动条。 - 布局层级:主菜单默认使用VBox布局,固定按钮容器和滚动容器依次排列,保证固定按钮始终处于顶部,滚动区域在下方。
内容的提问来源于stack exchange,提问作者le4a
相关产品推荐
相关产品推荐

