870920 Menu

JUCE类库常规控件之ComboBox

既可弹出下拉列表(菜单)以供选择,又可手工输入列表项的控件。ComboBox类同样有一个嵌套的抽象基类ComboBox::Listener,通常,声明和使用ComboBox的内容组件类继承该抽象基类,并在构造函数中创建ComboBox之后,让该对象绑定自己,从而可以捕获并处理用户点选ComboBox的某个列表项之后所产生的消息,以执行相应的功能性操作。

ComboBox的使用有4个关键点:

1、组合框添加列表项时,需指明该项的ID。注意:列表项ID不同于其索引。ID是手工指定的,可以是任意大于0的整数,只要不重复即可。而索引则是系统内部自动给出的编号,由0开始。示例代码:

2、本类的getSelectedId()可返回当前所选的项目ID,此ID作为判断处理所选列表项的依据。

3、内容组件需继承ComboBox::Listener,实现其纯虚函数comboBoxChanged(),在该函数中,首先判断哪个组合框对象产生了消息,而后基于该对象的getSelectedId()的返回值进行switch或if…else if…判断处理:

4、组合框对象需调用addListener()函数绑定捕获器。

ComboBox的重要成员函数:(略)

扩展阅读

  1. 组合框与菜单有异曲同工之妙,都是根据所选的条目执行对应的代码。基于用户体验的设计角度来说,同样都是只需点击两次鼠标,其中两次点击之间,需移动鼠标寻找目标。从GUI美工设计角度来说,二者都易于布局定位,占用屏幕空间较小。同样,从程序员的编码角度来说,算法思路也完全一致,判断选择了哪个条目,基于添加该条目时所设置ID(整型常量)。等等。
  2. 要判断并处理某个事件或消息,不一定非得用常规方法。比如JUCE-DEMO的图形渲染模块,根据组合框的条目,画布显示不同的内容。与其通过comboBoxChanged()方法,不如在画布类的paint()方法中直接判断和实现。前提是画布类使用了Timer计时器,不停的repaint()触发重绘。也就是说,某个对象基于另一个对象实现某个功能,不一定非得通过事件派遣与监听、函数回调、异步并发等“高级”技术来实现,还可以利用其他更简洁有效的方式直接在被调用对象的有关函数中完成。