我在网上找到了一个解决方案(见下文,大约2009年),这在我的机器上无效(Windows 7,Matlab R2013a):
Editor = com.mathworks.mlservices.MLEditorServices;
Editor.closeAll;
答案 0 :(得分:3)
正如您所注意到的,较新版本的Matlab不会为编辑器返回相同类型的Java
对象。
仍然可以使用与以前相同的命令访问主编辑器服务:
edtSvc = com.mathworks.mlservices.MLEditorServices ; %// get the main editor service ;
但这只返回服务的句柄,而不是单个编辑器。
丹尼尔回答说,您可以从那里关闭全部服务,这将立即关闭所有编辑。您可以使用以下两种方法之一:
edtSvc.getEditorApplication.close ; %// Close all editor windows. Prompt to save if necessary.
edtSvc.getEditorApplication.closeNoPrompt ; %// Close all editor windows, WITHOUT SAVE!!
现在在这个版本中,每个打开的文件实际上都是编辑器对象的一个实例。如果要控制单个编辑器选项卡/窗口,可以检索编辑器对象列表,然后单独应用它们的方法:
edtList = edtSvc.getEditorApplication.getOpenEditors.toArray ; %// get a list of all the opened editor
edtList =
java.lang.Object[]:
[com.mathworks.mde.editor.MatlabEditor]
[com.mathworks.mde.editor.MatlabEditor]
[com.mathworks.mde.editor.MatlabEditor]
返回com.mathworks.mde.editor.MatlabEditor
对象的向量。 (本例中我的编辑器中有3个打开的文件)。
从现在开始,每个对象都控制一个单独的文件。您可以关闭单个文件,但需要知道要定位的文件是哪个索引。要知道哪一个指向什么,您可以查询getLongName
属性:
>> edtList(1).getLongName
ans =
C:\TEMP\StackExchange\Editor_control.m
但是如果你必须控制单个文件,我发现构建一个具有与文件名对应的字段名称的结构更容易。这可以这样做:
for k=1:length(edtList) ;
[~, fname ]= fileparts( char( edtList(k).getLongName.toString ) ) ;
edt.( fname ) = edtList(k) ;
end
现在我的结构有了有意义的名字(好吧,至少对我来说,你的文件和字段名称当然会有所不同):
>> edt
edt =
Bending_Movie_Time_Lapse: [1x1 com.mathworks.mde.editor.MatlabEditor]
Editor_control: [1x1 com.mathworks.mde.editor.MatlabEditor]
foldfunction_test: [1x1 com.mathworks.mde.editor.MatlabEditor]
回到 关闭单个文件 。这可以使用与之前相同的方法之一轻松完成:
edt.foldfunction_test.close %// close with prompt if necessary
edt.foldfunction_test.closeNoPrompt %// close immediately without save
请注意,在此阶段,您还可以访问编辑器文件的一个很好的方法和属性列表。您可以使用Matlab的自动完成( Tab 键)来查看它们。
在Matlab R2013a / Windows 7 64位上完成的示例
答案 1 :(得分:1)
以下似乎有效。我已经在Matlab R2014b,Windows 7 64位中进行了测试。
D
。D
次以关闭所有打开的文件。 (可选)还发送 N 键击D
次,以防某些文件未保存并且您要关闭它(即当编辑器询问您是否要保存它时回复“否”)。如果文件已经保存,发送 N 不会造成任何伤害。对于第1步,我在this post中找到灵感。对于步骤2和3,我检查了编辑器对象的方法,直到我发现了一些有趣的东西。对于第4步,我采用了我在this answer中使用的程序,后者又基于this information。
代码:
closeUnsaved = 1; %// 1 if you want to close even if documentds are not saved
%// Step 1:
desktop = com.mathworks.mde.desk.MLDesktop.getInstance;
jEditor = desktop.getGroupContainer('Editor').getTopLevelAncestor; %// editor object
%// Step 2:
D = jEditor.getGroup.getDocumentCount;
%// Step 3:
jEditor.requestFocus; %// make editor the window in front
%// Step 4:
robot = java.awt.Robot;
for n = 1:D
robot.keyPress (java.awt.event.KeyEvent.VK_ALT); %// press "ALT"
robot.keyPress (java.awt.event.KeyEvent.VK_F4); %// press "F4"
robot.keyRelease (java.awt.event.KeyEvent.VK_F4); %// release "F4"
robot.keyRelease (java.awt.event.KeyEvent.VK_ALT); %// release "ALT"
if closeUnsaved
robot.keyPress (java.awt.event.KeyEvent.VK_N); %// press "N"
robot.keyRelease (java.awt.event.KeyEvent.VK_N); %// release "N"
end
end