我想在Matlab应用程序中使用questdlg
来提示用户反馈。如果没有可用的显示(例如,通过非转发的ssh会话或者如果Matlab以-nodisplay
启动),questdlg
将失败(参见下文)。有没有办法确定是否可以从Matlab代码中获得显示,以便我可以回退到基于文本的替代方案?
如果使用-nodisplay
选项启动Matlab,qusetdlg
将生成以下输出并“挂起”Matlab(在uiwait
中)。虽然用户可以使用Ctl-C
来逃避,但没有任何迹象表明这个选项,一个天真的用户可能会认为Matlab确实是挂起的:
>> questdlg('test','test')
Warning: This functionality is no longer supported under the -nodisplay and
-noFigureWindows startup options. For more information, see "Changes to
-nodisplay and -noFigureWindows Startup Options" in the MATLAB Release Notes.
To view the release note in your system browser, run
web('http://www.mathworks.com/access/helpdesk/help/techdoc/rn/br5ktrh-1.html#br5ktrh-3',
'-browser')
> In uitools/private/warnfiguredialog at 19
In dialog at 37
In questdlg at 117
Warning: This functionality is no longer supported under the -nodisplay and
-noFigureWindows startup options. For more information, see "Changes to
-nodisplay and -noFigureWindows Startup Options" in the MATLAB Release Notes.
To view the release note in your system browser, run
web('http://www.mathworks.com/access/helpdesk/help/techdoc/rn/br5ktrh-1.html#br5ktrh-3',
'-browser')
> In uitools/private/warnfiguredialog at 19
In uiwait at 41
In questdlg at 378
答案 0 :(得分:26)
首先,这里列出了相关的启动选项,以及支持它们的操作系统(否则它们将被忽略并且不起作用):
-nojvm
[UNIX]:从没有JVM开始,任何需要Java失败的东西(包括Handle Graphics功能)-nodisplay
[UNIX]:不使用X-Window显示,忽略$DISPLAY
环境变量-noFigureWindows
[全部]:无头模式,不会显示数字-nodesktop
[ALL]:IDE未启动,而是命令提示符由于我只能访问Windows安装的MATLAB,所以如果有人可以在UNIX上复制以下实验,通过使用-nodisplay
选项启动MATLAB,或者在没有DISPLAY
的情况下运行,我将会感激不尽。环境变量集,结合-nodisplay
和-nojvm
选项。
» [usejava('jvm'),usejava('awt'),usejava('mwt'),usejava('Desktop')]
ans =
1 1 1 0
» get(0,'ScreenSize')
ans =
1 1 1600 1024
» feature('ShowFigureWindows')
ans =
1
» questdlg('?','?');
[works fine]
» plot(1:10)
[works fine]
» [usejava('jvm'),usejava('awt'),usejava('mwt'),usejava('Desktop')]
ans =
1 1 1 1
» get(0,'ScreenSize')
ans =
1 1 1600 1024
» feature('ShowFigureWindows')
ans =
0
» questdlg('?','?');
Warning: This functionality is no longer supported ....
» plot(1:10)
[no plot]
» [usejava('jvm'),usejava('awt'),usejava('mwt'),usejava('Desktop')]
ans =
1 1 1 0
» get(0,'ScreenSize')
ans =
1 1 1600 1024
» feature('ShowFigureWindows')
ans =
0
» questdlg('?','?');
Warning: This functionality is no longer supported ....
» plot(1:10)
[no plot]
总之,这是我将用于跨平台获得一致结果的测试:
if usejava('jvm') && ~feature('ShowFigureWindows')
%# use text-based alternative (input)
else
%# use GUI dialogs (questdlg)
end
一些参考文献:
which -all warnfiguredialog.m
答案 1 :(得分:2)
This MATLAB newsgroup thread建议检查root object 'ScreenSize'
property的第三个和第四个值将告诉您显示是否可用。我目前无法测试它,但您可以尝试将其添加到您的代码中:
screenSize = get(0,'ScreenSize');
if isequal(screenSize(3:4),[1 1])
%# Use text-based alternative
else
%# Call questdlg
end
答案 2 :(得分:1)
不确定这是否有效,但您可以尝试usejava
功能与桌面'参数。
答案 3 :(得分:1)
is_gui_mode = usejava('desktop') && usejava('awt');
答案 4 :(得分:1)
@ Amro的answer on this page很好,但不在parfor
循环中工作。事实上,基于usejava()
和feature('ShowFigureWindows')
的解决方案都不适用于这种情况,因为一旦parfor
循环开始,环境就会发生变化。
可靠的方法是@gnovice's answer。具体做法是:
parfor k=1:N
scr = get(0,'ScreenSize');
if isequal(scr(3:4),[1 1])
% text-based version
else
% GUI version
end
end
或者,您可以在进入parfor
循环之前应用解决方案,将结果存储在变量中,然后仅在parfor循环中检查该变量:
scr = get(0,'ScreenSize');
istext = isequal(scr(3:4),[1 1]);
% or
istext = ~usejava('jvm') || ~feature('ShowFigureWindows');
parfor k=1:N
if istext
% text-based version
else
% GUI version
end
end
但是,根据您的应用程序,这可能不可靠(例如,如果parfor循环改变了上下文,但这种情况并不常见)。