MATLAB R2014b 以降で GUI を起動すると、オブジ​ェクトが表示されなか​ったり、一部が隠され​ているのはなぜですか​?

15 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2016 年 6 月 24 日
回答済み: MathWorks Support Team 2016 年 6 月 24 日
uipanel と uipanel 内に Axes が含まれるような GUI(Figure)があります。MATLAB R2014a 以前のリリースでは、意図したとおりに表示されますが、MATLAB R2014b 以降のバージョンではAxes が表示されず、パネルのみが表示されています。
バージョン間の挙動の違いが発生する理由を教えてください。

採用された回答

MathWorks Support Team
MathWorks Support Team 2016 年 6 月 24 日
MATLAB R2014b 以降ではグラフィックスに関する仕様が大きく変更され、より一貫性のある動作を提供されるようになりました。
この問題の原因としては、新しいグラフィックスシステムでは、Axes、uicontrol、uitables が他のグラフィックスコンポーネントによって隠されているために、正しく表示されていない可能性があります。
R2014a 以前のリリースでは、Childrenプロパティにリストされたコンポーネントの順序は、それらが作成される順序と一致します。しかし、この順序は必ずしも画面上の部品の前面から背面への位置決め(または重ね順)と一致しません。
さらに、uicontrol はいつもの uipanel と uibuttongroups の最上部に表示されます。Axes は、uipanel の子オブジェクトでなくても、uipanel の上に表示されます。
R2014b 以降のリリースでは、Children プロパティにリストされたコンポーネントの順序は、画面上の子コンポーネントの重なり順と一致します。そのため、GUI に uipanel や uibuttongroup が含まれている場合は、以下の内容を踏まえ、コードをアップデートする必要がある場合があります。
  • uipanel や uibuttongroup 上に Axes, uicontrolやuitable を表示する場合、確実にその親子関係を Parent プロパティにて指定します。下に表示されるオブジェクトが、上に表示されるオブジェクトの親になるように指定します。
  • uipanel と uibuttongroup は uicontrol と uitable と同様に、画面上における重なり順を有します。
プログラミングによるレイアウトの復元
このコードは、R2014a 以前のリリースで実行すると、figure に 2 つのパネルを配置します。上部のパネルには、Axes を含み、下部のパネルには、プッシュボタンとポップアップメニューが含まれます。
hf = figure;
hb = uicontrol('Style','PushButton',...
'String','Plot',...
'Position',[175, 40, 60, 25]);
hpulabel = uicontrol('Style','text',...
'String', 'Plot Type',...
'Position', [300, 65, 60, 20]);
hpu = uicontrol('Style', 'popupmenu',...
'String', {'bar', 'plot', 'stem'},...
'Position',[310, 40, 60, 25]);
topp = uipanel('Title', 'Plot',...
'Position',[0 .25 1 .75]);
ah = axes('Position', [.10, .35 .80 .60]);
bottomp = uipanel('Title','Plotting Options',...
'Position',[0 0 1 .25]);
しかし、R2014b 以降のリリースで実行すると、パネルのみ表示され、その他のオブジェクトは表示されなくなります。
R2014b 以降にて、全オブジェクトが正しく表示されるためには、uipanel に含まれる各オブジェクトの Paraent プロパティを設定します。例えば、以下のように修正します。
 
hf = figure;
topph = uipanel('Parent', hf,'Title', 'Plot',...
                'Position',[0 .25 1 .75]);
axes('Parent', topph, 'Position', [.10, .35 .80 .60]);
bottomph = uipanel('Parent', hf,'Title','Plotting Options',...
                   'Position',[0 0 1 .25])
hpulabel = uicontrol('Parent', bottomph, 'Style','text',...
                     'String', 'Plot Type',...
                     'Position', [300, 65, 60, 20]);
hb = uicontrol('Parent', bottomph, 'Style','PushButton',...
               'String','Plot',...
               'Position',[175, 40, 60, 25]);
hpu = uicontrol('Parent', bottomph, 'Style', 'popupmenu',...
                'String', {'bar', 'plot', 'stem'},...
                'Position',[310, 40, 60, 25]);
GUIDE レイアウトエディタによる復元
GUIDE レイアウト上でレイアウトを復元するには、以下の 2 つの処理を適宜行います。 * レイアウトの修正 * コンポーネントの子オブジェクトの順序の修正
GUIDEでレイアウトを修正するには、GUIDEで Fig ファイルを開き、オブジェクトの重なり順を再設定するために、"最背面へ移動" オプションを使用します。例えば、Panel オブジェクトを全てのオブジェクトの背後に移動したい場合には、uipanel を右クリックし、"最背面へ移動"を選択します。
コンポーネントの子オブジェクトの順序を修正するには、GUIDE の [表示] メニューにある [オブジェクト ブラウザ] を選択します。これにより、GUI がレイアウトエディタ上と同様の表示となります。次に、uipanel や uibuttongroup に含めたいオブジェクトを選択し、マウスを少し動かして、パネルやボタングループ内に配置します。このとき、中に入れたオブジェクトが uipanel や uibuttongroup の子オブジェクトになっていることをオブジェクトブラウザでも確認します。
 

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeR2014b でのグラフィックスの変更点 についてさらに検索

タグ

製品


リリース

R2014b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!