我有TopComponent
以properties
模式显示。有两种方法可以打开它。
我正在使用这样的注释配置第一个操作。
@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时使用上述实例而不是创建新实例?
答案 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的支持。