0

我有一个TopComponent以模式显示的properties。有两种方法可以打开它。

  1. 通过窗口/顶部组件打开操作
  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它以启用第二个操作。

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

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

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

4

2 回答 2

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

这就是我个人的做法,到目前为止效果很好。

于 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方法而不是每次都实例化它。

然后我实现了一个自定义操作,然后将该操作连接到在 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 的支持。

支持单例 TopComponents - @FactoryMethod

于 2013-05-11T20:02:14.910 回答