You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含大量qx.ui.menu.Button的qx.ui.menu.Menu添加垂直滚动条?

实现Menu添加与List一致的垂直滚动条

要给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});

关键说明

  1. 滚动容器选择:qx.ui.container.Scroll是Qooxdoo标准滚动组件,List内部也使用它实现滚动,因此滚动条样式天然匹配,无需额外自定义样式。
  2. 最大高度控制:通过setMaxHeight限制滚动容器高度,当按钮总高度超过该值时,垂直滚动条自动显示。
  3. 外观继承:设置appearance: "list-scrollbar"后,滚动条会自动继承项目中List的滚动条主题样式,保持视觉统一。

内容的提问来源于stack exchange,提问作者le4a

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:21:31