netbeans Topcomponent开了两次

时间:2013-03-23 19:36:26

标签: netbeans-platform

我有TopComponentproperties模式显示。有两种方法可以打开它。

  1. 通过Window / Top组件打开操作
  2. 打开一个文件,顶部组件会自动打开。
  3. 我正在使用这样的注释配置第一个操作。

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

    我手动创建新TopComponent并在其上调用open以启用第二个操作。

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

    当用户打开文件时,第二个代码片段会打开PUMLTopComponent的实例。但是如果用户现在点击Window / open动作,则会打开第二个窗口。

    如何使用netbeans注册手动实例化的TopComponent实例,以便当用户点击Window / open action netbeans时使用上述实例而不是创建新实例?

2 个答案:

答案 0 :(得分:2)

如果在整个应用程序中只需要一个TopComponent实例,则只需将其设为单个实例,然后在代码中的任何位置使用静态方法获取实例。

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);
    }
});

这就是我亲自做的事情,到目前为止效果很好。

答案 1 :(得分:0)

问题是TopComponent上的注释。

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

我删除了这些注释。我假设注释每次都实例化一个新的TopComponent,我无法告诉注释调用getInstance方法而不是每次实例化它。

然后我实现了一个自定义操作,然后连接动作以在topcomponent上调用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的支持。

Support to Singleton TopComponents - @FactoryMethod