DevFaqActionContextSensitiveJa
セクションにより自動的に有効、無効になるアクションを作るにはどのようにしたらよいですか?
これを行うには3つの方法があり、正確に必要なことによります:
CookieAction
CookieAction は選択されたノード Lookup にあるものに敏感に反応するアクションを書くために使われます。選択された Node の Lookup の中に存在するに違いない1つ、または複数のクラス、そして他のいくつかのイネーブルメントに関するセマンティクスを規定します。
より古いクラスでは、内部は Node.getCookie() が使われており、その通り、そのメソッドによって戻される実際のものにのみアクションは反応します - 言い換えれば、マーカーインターフェイスの Node.Cookie を実装したオブジェクトだけがここで動作します。
NodeAction
NodeAction はいくらか柔軟ですが、実装により多くのコードを必要とします。変更があるたびに有効化されたノードの配列をただ渡し、そして望むようにそれ自体を有効、または無効にすることを選択できます。本質的にはこれは自動的に 大域 Node セクションを追跡する 単なるアクションです。
自分で書く
下記は比較的単純で、そして好きなどんなイネーブルメントロジックでも実行する方法をもたらしてくれます(NodeAction でもできますが、これはやや率直な場合があり、コードは Nodes について全く心配する必要がありません)。これがどのように動作しているかを理解するには、 the global action context のセクションを参照ください:
public class FooAction extends AbstractAction implements LookupListener, ContextAwareAction {
private Lookup context;
Lookup.Result lkpInfo;
public FooAction() {
this(Utilities.actionsGlobalContext());
}
private FooAction(Lookup context) {
putValue (Action.NAME, NbBundle.getMessage(FooAction.class,
"LBL_Action")); //NOI18N
this.context = context;
}
void init() {
assert SwingUtilities.isEventDispatchThread()
: "this shall be called just from AWT thread";
if (lkpInfo != null) {
return;
}
//The thing we want to listen for the presence or absence of
//on the global selection
Lookup.Template tpl = new Lookup.Template(Whatever.class);
lkpInfo = context.lookup (tpl);
lkpInfo.addLookupListener(this);
resultChanged(null);
}
public boolean isEnabled() {
init();
return super.isEnabled();
}
public void actionPerformed(ActionEvent e) {
init();
Collection c = lkpInfo.allItems();
//do something with them here
}
public void resultChanged(LookupEvent ev) {
setEnabled (lkpInfo.allItems().size() != 0);
}
public Action createContextAwareInstance(Lookup context) {
return new FooAction(context);
}
}
- 日本語訳 : Junji Takakura
- 英文 (翻訳したバージョン: 5)
- 日本語 NetBeans 開発者 FAQ へ戻る
