0

TopComponentモードで表示される がありますproperties。これを開くには 2 つの方法があります。

  1. Window/Top コンポーネントの open アクション経由
  2. ファイルを開くと、最上位のコンポーネントが自動的に開かれます。

そのような注釈を使用して最初のアクションを構成しています。

@ActionID(category = "Window", id = "org.netbeans.modules.plantumlnb.PUMLTopComponent")
@ActionReference(path = "Menu/Window" /*, position = 333 */)
@TopComponent.OpenActionRegistration( displayName = "#CTL_PUMLAction",
    preferredID = "PUMLTopComponent")

私は手動で新しいものを作成し、それをTopComponent呼び出しopenて 2 番目のアクションを有効にしています。

    SwingUtilities.invokeLater(new Runnable(){
        @Override
        public void run() {
            PUMLTopComponent pumltc = new PUMLTopComponent();                
            pumltc.open();
            pumltc.setNewContent(obj);
        }
    });

ユーザーがファイルを開くと、PUMLTopComponent のインスタンスが 2 番目のコード スニペットによって開かれます。しかし、ユーザーが Window/open アクションをクリックすると、2 つ目のウィンドウが開きます。

ユーザーが Window/open アクションをクリックしたときに netbeans が新しいインスタンスを作成するのではなく、上記のインスタンスを使用するように、手動でインスタンス化された TopComponent インスタンスを netbeans に登録するにはどうすればよいですか?

4

2 に答える 2

2

アプリケーション全体で TopComponent のインスタンスが 1 つだけ必要な場合は、単純にそれをシングルトンにして、コード内の任意の場所で静的メソッドを使用してインスタンスを取得できます。

PUMLTopComponent.java:

private static PUMLTopComponent instance;

public PUMLTopComponent() {
    initComponents();
    // your stuff
    instance = this;
}

public static PUMLTopComponent getInstance() {
    return instance;
}

次に、あなたの行動で:

SwingUtilities.invokeLater(new Runnable(){
    @Override
    public void run() {
        PUMLTopComponent pumltc = PUMLTopComponent.getInstance();                
        pumltc.open();
        pumltc.requestActive(); //you might also need to call this
        pumltc.setNewContent(obj);
    }
});

これは私が個人的に行っている方法であり、これまでのところうまく機能しています。

于 2013-04-28T15:27:21.067 に答える
0

問題は、TopComponent の注釈でした。

@ActionID(category = "Window", id = "org.netbeans.modules.plantumlnb.PUMLTopComponent")
@ActionReference(path = "Menu/Window" /*, position = 333 */)

これらの注釈を削除しました。アノテーションは毎回新しい TopComponent をインスタンス化していたと思いますが、getInstance毎回インスタンス化する代わりにメソッドを呼び出すようにアノテーションに指示する方法はありませんでした。

次に、カスタム アクションを実装し、次に示すように、トップ コンポーネントで open を呼び出すようにアクションを配線しました。これで問題が解決したようです。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.netbeans.modules.plantumlnb;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionRegistration;
import org.openide.util.NbBundle.Messages;

@ActionID(
        category = "Window",
        id = "org.netbeans.modules.plantumlnb.PUMLViewAction")
@ActionRegistration(
        iconBase = "org/netbeans/modules/plantumlnb/icon.png",
        displayName = "#CTL_PUMLViewAction")
@ActionReferences({
    @ActionReference(path = "Menu/Window/Other", position = 1050),
    @ActionReference(path = "Shortcuts", name = "DS-P"),
    @ActionReference(path = "Shortcuts", name = "DS-U")
})
@Messages("CTL_PUMLViewAction=Plant UML")
public final class PUMLViewAction implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        PUMLTopComponent pumlTopComponent = PUMLTopComponent.getInstance();
        pumlTopComponent.open();
    }
}

編集

Netbeans は、Netbeans 7.3 の最初のパッチでシングルトン TopComponents のサポートを追加しました。

シングルトン TopComponents のサポート - @FactoryMethod

于 2013-05-11T20:02:14.910 に答える