情况:我有一个GUI,其中包含对象列表及其属性。其中一个属性是布尔值,非常适合复选框。
该列表允许同时选择多个对象,以批量更改属性。选择多个对象时,我会更新属性列表以显示常用对象。
如果对象具有与布尔属性相同的值,则一切正常,但我想在第三个状态中显示一个复选框:"未定义","其他"当这个属性不同时。
到目前为止,我还没有能够创建一个三态复选框。有可能吗?
使用以下变量创建复选框:
myCheckbox = uicontrol(figureHandle,...
'Style','CheckBox',...
'String','Boolean Property');
set(myCheckbox, 'Value', 1); % Checks the checkbox
set(myCheckbox, 'Value', 0); % Unchecks the checkbox
set(myCheckbox, 'Value', 2); % Expected: tristate. Gets: warning
尝试将复选框设置为第三个状态时,收到一条警告消息,指出value
等于Max
或Min
值。这些必须以1
的差异分隔。那么,有没有办法在Matlab中显示三态复选框?
答案 0 :(得分:0)
不直接,这是一种耻辱。但有一些undocumented Matlab functionality to do so。 更具体地说,Java用户界面支持三态复选框,可以直接使用它们来显示这些元素。
然而,这并不是一个完美的解决方案,因为这个UI元素不具备其他Matlab UI元素所具有的标准属性集,因此,函数get
,set
等等......无法影响其状态。
未记录的matlab网站points out,findobj
脚本可用于更轻松地处理此用例。然而,这需要额外的依赖(findobj
本身)。
我确定的解决方法是将复选框的外观更改为单选按钮。这看起来并不完美,并且是一个hacky解决方案,但它实现了它作为视觉提示的角色,状态不是正常的,特别是因为我在用户界面中没有任何其他单选按钮。
set(myCheckbox, 'Style', 'RadioButton', 'Value', 1); % Setting the value to 1 is cosmetic
这里的优点是它保留了现有的回调,提供了明显的视觉线索,与Matlab方法和属性兼容,并且实现起来非常简单(radiobutton与复选框共享大多数属性,除了它的形状,很明显)。
主要的不便之处在于我们不能依赖用户的知识来确定单选按钮是三态复选框,因为它不是常见的约定。然而,这可以通过教育用户(例如,使用工具提示)来解决。由于这个工具将被有限数量的人使用,这对我来说是一个可接受的妥协。
第二个缺点,也许不太明显,是UI线程不再为我们处理状态变化。我们必须改变回调中对象的Style
属性。我仍然认为额外的代码是良好的权衡,因为替代方案需要一些(更多?)。