2013-03-23 62 views
0

我有一個TopComponent顯示在properties模式。有兩種方法可以打開它。netbeans Topcomponent打開兩次

    通過窗口/頂部的組件打開動作
  1. 打開一個文件和頂部的組件會自動打開。

我正在配置使用註釋的第一個操作,如下所示。

@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實例,以便當用戶單擊窗口/打開動作時,netbeans使用上述實例而不是創建新實例?

回答

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

這是怎麼了,我個人做的,到目前爲止的偉大工程。

+0

感謝您的回覆。 TopComponent已經是單身人士。查看我的答案,瞭解我的修復的更多細節。 – ShaggyInjun 2013-05-11 19:59:54

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

EDIT

Netbeans的添加用於在Netbeans的7.3的第一貼片單的TopComponents支持。

Support to Singleton TopComponents - @FactoryMethod