如何为含大量qx.ui.menu.Button的qx.ui.menu.Menu添加垂直滚动条?
要给qx.ui.menu.Menu添加和qx.ui.list.List样式一致的垂直滚动条,核心思路是利用Qooxdoo内置的qx.ui.container.Scroll容器(List内部也依赖该组件实现滚动),将所有菜单按钮放入滚动容器后再添加到Menu中。具体实现步骤如下:
- 创建垂直布局容器承载所有菜单按钮
- 将按钮容器放入
Scroll组件,设置滚动容器的最大高度(超过此高度自动显示滚动条) - 配置滚动条外观,确保和List的滚动条样式一致
- 将滚动容器添加到Menu中
修改后的完整代码如下:
// 创建Menu实例 var menu = new qx.ui.menu.Menu(); // 创建承载按钮的垂直布局容器 var buttonContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox()); // 添加菜单按钮到垂直容器 var button1 = new qx.ui.menu.Button("Line 431"); var button2 = new qx.ui.menu.Button("Line 30"); // 可批量添加更多按钮模拟大量数据场景 for(var i=0; i<20; i++){ buttonContainer.add(new qx.ui.menu.Button(`Line ${i}`)); } buttonContainer.add(button1); buttonContainer.add(button2); // 创建滚动容器实现滚动效果 var scrollContainer = new qx.ui.container.Scroll(); // 设置滚动容器最大高度,超过则触发滚动 scrollContainer.setMaxHeight(300); // 配置滚动条外观,与List滚动条保持一致 scrollContainer.getChildControl("scrollbar-y").set({ appearance: "list-scrollbar" }); // 将按钮容器放入滚动容器 scrollContainer.add(buttonContainer); // 将滚动容器添加到Menu menu.add(scrollContainer); // 创建SplitButton并关联Menu var forwardButton = new qx.ui.toolbar.SplitButton( "Next", null, menu ); var forwardButton2 = new qx.ui.toolbar.SplitButton( "Next2", null, menu ); // 添加到根容器 this.getRoot().add(forwardButton); this.getRoot().add(forwardButton2, {top: 30});
关键说明
- 滚动容器选择:
qx.ui.container.Scroll是Qooxdoo标准滚动组件,List内部也使用它实现滚动,因此滚动条样式天然匹配,无需额外自定义样式。 - 最大高度控制:通过
setMaxHeight限制滚动容器高度,当按钮总高度超过该值时,垂直滚动条自动显示。 - 外观继承:设置
appearance: "list-scrollbar"后,滚动条会自动继承项目中List的滚动条主题样式,保持视觉统一。
内容的提问来源于stack exchange,提问作者le4a
相关产品推荐
相关产品推荐

