I want to disable the popup menu on the toolbars in the main window. How do I do that?

Apache NetBeans Wiki Index

Note: These pages are being reviewed.

There is no canonical (or pretty) way to do this, but there is a hack you can do - it works in NetBeans 5.0, 5.5 and 6.x (and probably earlier versions but this wasn’t tested).

Create the following ModuleInstall class (remember to add a reference to it in the module manifest, e.g.

OpenIDE-Module-Install: org/netbeans/modules/toolbarthing/Installer.class

If you are using 5.0’s update 1 of module development support or later, you can just use New File > NetBeans Plug-In Modules > Module Installer):

package org.netbeans.modules.toolbarthing;
import java.awt.Component;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JToolBar;
import org.openide.modules.ModuleInstall;
import org.openide.windows.WindowManager;
public class Installer extends ModuleInstall implements Runnable {

    public void restored() {
         WindowManager.getDefault().invokeWhenUIReady(this);
    }

    public void run() {
        JToolBar[] tb = findToolbars();
        for (int i = 0; i < tb.length; i++) {
            processToolbar (tb[I]);
        }
    }

    private JToolBar[] findToolbars() {
        List l = new ArrayList();
        JFrame jf = (JFrame) WindowManager.getDefault().getMainWindow();
        findToolbars (jf.getContentPane(), l);
        JToolBar[[ | ]] tb = (JToolBar[[ | ]]) l.toArray(new JToolBar[L.size()]);
        return tb;
    }

    private void findToolbars(Component c, List l) {
        if (c instanceof JToolBar) {
            l.add(c);
        } else if (c instanceof Container) {
            Component[] cc = ((Container) c).getComponents();
            for (int i=0; i < cc.length; i++) {
                findToolbars(cc[I], l);
            }
        }
    }

    private void processToolbar (JToolBar bar) {
        MouseListener[] ml = bar.getMouseListeners();
        for (int i = 0; i < ml.length; i++) {
            if (ml[I].getClass().getName().indexOf("PopupListener") >= 0) {
                bar.removeMouseListener (ml[I]);
            }
        }
    }
}

The above doesn’t seems to work in 6.9.1. This is another similar module installer hack to achieve this:

public class Installer extends ModuleInstall
{

  public void restored()
  {
    removeToolbarPopupMenu();
  }

  private void removeToolbarPopupMenu()
  {
    WindowManager.getDefault().invokeWhenUIReady(
      new Runnable()
      {
        @Override
        public void run()
        {
          removeAllPopupListeners(ToolbarPool.getDefault());
        }
      });
  }

  private static void removeAllPopupListeners(Component c)
  {
    if(c instanceof Container)
    {
      for(Component c2 : ((Container)c).getComponents())
      {
        for(MouseListener l : c2.getMouseListeners())
        {
          if(l.getClass().getName().contains("PopupListener"))
          {
            c2.removeMouseListener(l);
            // Uncomment to obtain a similar console output
            // Removing: org.openide.awt.ToolbarPool$PopupListener@1535ac from javax.swing.JPanel[...]
            // Removing: org.openide.awt.ToolbarPool$PopupListener@1535ac from org.openide.awt.Toolbar[File,...]
            //System.out.println("Removing: " + l + " from " + c2);
          }
        }
        findToolbars(c2);
      }
    }
  }
}