8

私は認めたくないよりも少し長い間、この件名の問題と格闘してきました。

ユーザーが>ボタンをクリックするか、エディターウィンドウ内で右クリックしてから>をActionクリックしたときに発生するのと同じことをプログラムで実行しようとしています。ViewCollapse AllCode FoldingFold All

これまでに試した\発見:

  • String対応する はActionenum com.mathworks.mde.editor.ActionIDおよび にあります'collapse-all-folds'
  • Actionアクティブ化されると、次のメソッドが実行されるようです: org.netbeans.api.editor.fold.FoldUtilities.collapseAll(...)(したがって、netbeans タグ)。
  • このコードによりEditorAction、 、ActionManager、のインスタンスを取得できMatlabEditorます。

jEd = com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor;
jAm = com.mathworks.mde.editor.ActionManager(jEd);
jAc = com.mathworks.mde.editor.EditorAction('collapse-all-folds');

私の問題は、実際に をアクティブにする方法が見つからないことActionです。

アイデア/代替案はありますか?


EDIT1 : 「本」を少し掘り下げた後、以前よりもさらに近づいたと思います(ただし、まだ十分ではありません)。本からの引用:

Java GUI コンポーネントは、多くの場合、 を使用して、マウス、キーボード、プロパティ、またはコンテナーのイベントでリスナーによって呼び出されるActionMapランナブルを格納します。Actionsオブジェクト メソッドとは異なりActions、MATLAB から直接呼び出すことはできません。

次に、大まかに次のような回避策を説明します。ある種のActionオブジェクトを取得します。以下に実装されているように、 を作成し、 を引数としてActionEventを呼び出しActionます。actionPerformedActionEvent

import java.awt.event.*;
jEd = com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor;
jAm = com.mathworks.mde.editor.ActionManager(jEd);
jAc = jAm.getAction(com.mathworks.mde.editor.EditorAction('collapse-all-folds'));
jAe = ActionEvent(jAm, ActionEvent.ACTION_PERFORMED, '');
jAc.actionPerformed(jAe);

このコードはエラーなしで実行されますが、(一見?) 何もしません。私は間違ったオブジェクトを呼び出していると思われます (ActionEventこの問題とはまったく関係がない可能性があります)。actionPerformedActionManager


PS

これを行うホットキーがあることは知っていますが(Ctrl+ =)、これは私が探しているものではありません(ホットキーの押下をシミュレートするコマンドがない限り:))。

4

2 に答える 2

3

計り知れないほどの掘り下げ、試行錯誤の末、やり遂げました!

function FullyCollapseCurrentScript()

%// Get the relevant javax.swing.text.JTextComponent:
jTc = com.mathworks.mlservices.MLEditorServices ...
        .getEditorApplication.getActiveEditor.getTextComponent();
%// Get the FoldHierarchy for the JTextComponent:
jFh = org.netbeans.api.editor.fold.FoldHierarchy.get(jTc);
%// Finally, collapse every possible fold:
org.netbeans.api.editor.fold.FoldUtilities.collapseAll(jFh);

end

または、単一の乱雑なコマンドに圧縮されている場合:

org.netbeans.api.editor.fold.FoldUtilities.collapseAll(...
org.netbeans.api.editor.fold.FoldHierarchy.get(com.mathworks. ...
mlservices.MLEditorServices.getEditorApplication.getActiveEditor. ...
getTextComponent()));

これは、エディターで現在開いているスクリプトで機能することに注意してください。

于 2014-10-07T22:42:37.537 に答える
1

完全な解決策ではありませんが、デフォルトのホットキーの押下をシミュレートするjava.awt.robotことは可能です。

...実際にアクションを直接起動する方法を見つける方が良いでしょう...

import java.awt.Robot;
import java.awt.event.*;
RoboKey = Robot;

jTextComp = com.mathworks.mlservices.MLEditorServices. ... 
        getEditorApplication.getActiveEditor.getTextComponent;


jTextComp.grabFocus()
drawnow;            %// give time for focus


if jTextComp.hasFocus()
    RoboKey.keyPress(KeyEvent.VK_CONTROL);
    RoboKey.keyPress(KeyEvent.VK_EQUALS);

    RoboKey.keyRelease(KeyEvent.VK_CONTROL);
    RoboKey.keyRelease(KeyEvent.VK_EQUALS);

    com.mathworks.mde.cmdwin.CmdWin.getInstance.grabFocus;  %// focus back to cmdwin

else
    warning('Failed to collapse folds: Editor could not take focus')
end
于 2014-09-23T16:52:54.903 に答える