Netbeans ExplorerTopComponent节点在显示对话框时失去焦点

时间:2012-12-19 05:58:34

标签: netbeans netbeans-7 netbeans-platform

我有一个netbeans RCP应用程序,它在explorertop组件中显示一组节点。选中后,我会在editortop组件上显示详细信息并且效果很好。当我在编辑器上显示使用JOptionPage的对话框时,将取消选择树中的选定节点,最终我的editortop组件也会丢失所选节点的详细信息。如果对话框打开,有没有办法保存树中的选定节点不被取消选择?

感谢。

1 个答案:

答案 0 :(得分:0)

很简单。

在您的explorertopcomponent中,您有LookupListner,“等待”事件“someYourNodeClass”(例如Album)出现在查找中。当您的explorertop组件不可见或者什么都不做时,您必须removeLookupListener。

/**
 * your explorertopcomponent
 */
@ConvertAsProperties(
    dtd = "-//com.galileo.netbeans.module//Y//EN",
    autostore = false)
@TopComponent.Description(
    preferredID = "YTopComponent",
    //iconBase="SET/PATH/TO/ICON/HERE", 
    persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "explorer", openAtStartup = false)
@ActionID(category = "Window", id = "com.galileo.netbeans.module.YTopComponent")
@ActionReference(path = "Menu/Window" /*, position = 333 */)
@TopComponent.OpenActionRegistration(
    displayName = "#CTL_YAction",
    preferredID = "YTopComponent")
@Messages({
"CTL_YAction=Y",
"CTL_YTopComponent=Y Window",
"HINT_YTopComponent=This is a Y window"
})
public final class YTopComponent extends TopComponent implements LookupListener {

private Lookup.Result<Album> result;

public YTopComponent() {
    initComponents();
    setName(Bundle.CTL_YTopComponent());
    setToolTipText(Bundle.HINT_YTopComponent());

}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );
}// </editor-fold>                        

// Variables declaration - do not modify                     
// End of variables declaration                   
@Override
public void componentOpened() {
    result = Utilities.actionsGlobalContext().lookupResult(Album.class);
    result.addLookupListener(this);
}

@Override
public void componentClosed() {
    result.removeLookupListener(this);
}

void writeProperties(java.util.Properties p) {
    // better to version settings since initial version as advocated at
    // http://wiki.apidesign.org/wiki/PropertyFiles
    p.setProperty("version", "1.0");
    // TODO store your settings
}

void readProperties(java.util.Properties p) {
    String version = p.getProperty("version");
    // TODO read your settings according to their version
}

public void resultChanged(LookupEvent le) {
    Collection<? extends Album> allInstances = result.allInstances();
    TopComponent findTopComponent = WindowManager.getDefault().findTopComponent("YourNodeExplorerWindow");
    if (findTopComponent == null) {
        return;
    }
    if (!findTopComponent.isShowing()) {
        return;
    }
    if (!allInstances.isEmpty()) {
        showDetail(allInstances.iterator().next());
    }
}
}

日尔卡