2017-05-11 18 views
0

状況:私は、オブジェクトのリストとそのプロパティを持つGUIを持っています。これらのプロパティの1つはブール値で、チェックボックスに適しています。Matlabのトライステートチェックボックスの作成方法は?

リストでは、複数のオブジェクトを同時に選択して、プロパティをバッチで変更できます。複数のオブジェクトを選択するときは、プロパティリストを更新して共通のものを表示します。

オブジェクトがブール値のプロパティに同じ値を設定している場合はすべて正常に動作しますが、このプロパティが異なる場合は「未定義」、「その他」のチェックボックスを第3の状態で表示します。

これまでのところ、私はトライステートチェックボックスを作成できませんでした。どういうわけか可能ですか?第3の状態にあるチェックボックスを設定しようとすると、私はvalueのいずれかMaxMin又は値に等しくなるよう、警告メッセージを取得

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 

チェックボックスがの変異体を使用して作成されます。それらは1の違いで区切られていなければなりません。だから、Matlabにトライステートのチェックボックスを表示する方法はありますか?

答えて

0

これは恥です。しかし、いくつかはundocumented Matlab functionality to do soです。 具体的には、Javaユーザーインターフェイスはトライステートチェックボックスをサポートしており、これらの要素を直接使用することで表示することができます。

しかし、このUI要素は他のMatlab UI要素とは異なる標準的なプロパティセットを持たないため、getsetなどのような機能は完全な解決策ではありませんその状態に影響を与えることができる。

スクリプトを使用して、このユースケースをより簡単に処理できる、文書化されていないウェブサイトpoints outです。しかし、これには余分の依存関係が必要です(findobj自体)。


私が解決した解決策は、チェックボックスの外観をラジオボタンのものに変更することでした。これは完璧に見えず、ハックな解決策ですが、ユーザーインターフェイスに他のラジオボタンがないため、状態が正常ではないという視覚的な手がかりとしての役割を果たします。

set(myCheckbox, 'Style', 'RadioButton', 'Value', 1); % Setting the value to 1 is cosmetic 

ここでの利点は、それが既存のコールバックを保持することで明らかに視覚的な手がかりを提供し、Matlabのメソッドとプロパティと互換性があり、チェックボックス付き(ラジオボタン株式ほとんどのプロパティを実装することは非常に簡単です、除きますその形状のために、明らかに)。

主な不都合は、一般的な規則ではないため、ラジオボタンがトライステートのチェックボックスであることをユーザーが判断できないということです。しかし、これはユーザーを教育することで解決できます(たとえば、ツールチップを使用して)。このツールは限られた人数で使用されるため、これは私にとって許容される妥協です。

第2の欠点は、おそらくそれほど明白ではないが、UIスレッドが私たちの状態変更をもう処理しないということです。代わりに、コールバック内のオブジェクトのStyleプロパティを変更する必要があります。私はまだ余分なコードが良いトレードオフであると考えています。なぜなら、代わりにいくつか(もっと?)必要とするからです。

1

'有効'プロパティを 'オフ'に設定するか、適用する場合は '値'が0または1でない場合は非表示にすることを検討することがあります。コールバックでこのプロパティを読み取る必要がありますその '価値'を読んでください。

val = 1; % it may be other, like 2 
myCheckbox = uicontrol(gcf, 'Style','CheckBox', String','Boolean Property'); 
if val==1 || val==0 
    set(myCheckbox, 'Enable', 'on'); % make sure enabled 
    % set(myCheckbox, 'Visible', 'on'); % or make it visible 
    set(myCheckbox, 'Value', val); % Check or uncheck 
else 
    % set(myCheckbox, 'Value', 0); % uncheck it optionally 
    set(myCheckbox, 'Enable', 'off'); % disabled 
    % set(myCheckbox, 'Visible', 'off'); % invisible 
end 
+0

ありがとうございます。ただし、コールバックも無効になるため、このソリューションではできません。また、選択したすべての要素のプロパティを一度に強制的に使用できるようにする必要があります。しかし、それがディスプレイ用のものであれば、それはうまくいくかもしれません。 – MayeulC

関連する問題