Hello, In my RCP application I would like to get a toolbar that shows the action label under the icon of each button (similar to Mac OS applications).
I’ve found this post https://blogs.oracle.com/geertjan/custom-tabbed-toolbar-with-corporate-image-and-central-registry-integration <https://blogs.oracle.com/geertjan/custom-tabbed-toolbar-with-corporate-image-and-central-registry-integration> that I’ve adapted to my needs and it works except for that actions with a Presenter.Toolbar that is not a button (for example the QuickSearch and other custom actions similar to https://platform.netbeans.org/tutorials/70/nbm-google.html <https://platform.netbeans.org/tutorials/70/nbm-google.html>). In that cases I’m unable to show the components in the toolbar. Maybe is there another way to achieve this? Here is my code: public abstract class ToolbarComponentProvider { public abstract JComponent createToolbar(); public static ToolbarComponentProvider getDefault() { ToolbarComponentProvider provider = Lookup.getDefault().lookup(ToolbarComponentProvider.class); if (provider == null) { provider = new DefaultToolbarComponentProvider(); } return provider; } private static class DefaultToolbarComponentProvider extends ToolbarComponentProvider { private Icon loadIconBaseWithExtension(String base, String extension, int size) { String resourceID = base + size + extension; Image image = ImageUtilities.loadImage(resourceID); return (image != null) ? new ImageIcon(image) : null; } private JButton createButton(Action action) { JButton button = new JButton(action); button.setFocusable(false); button.setBorderPainted(false); button.setMargin(new java.awt.Insets(0, 2, 0, 2)); button.setText(Actions.cutAmpersand( (String) action.getValue(Action.NAME))); String iconBase = (String) action.getValue("iconBase"); if (iconBase != null) { int lastDot = iconBase.lastIndexOf('.'); int lastSlash = iconBase.lastIndexOf('/'); if ((lastSlash > lastDot) || (lastDot == -1)) { // no .extension button.setIcon(loadIconBaseWithExtension(iconBase, "", 24)); } else { String base = iconBase.substring(0, lastDot); String ext = iconBase.substring(lastDot); button.setIcon(loadIconBaseWithExtension(base, ext, 24)); } button.setVerticalTextPosition(SwingConstants.BOTTOM); button.setHorizontalTextPosition(SwingConstants.CENTER); } return button; } @Override public JComponent createToolbar() { // ToolbarPool.getDefault().waitFinished(); // return ToolbarPool.getDefault(); JPanel container = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); FileObject fo = FileUtil.getConfigFile("Toolbars"); for (FileObject parent : FileUtil.getOrder(Arrays.asList(fo.getChildren()), true)) { if (parent.isFolder()) { int count = 0; JToolBar toolbar = new JToolBar(parent.getName()); for (FileObject child : FileUtil.getOrder(Arrays.asList(parent.getChildren()), true)) { try { DataObject dataObj = DataObject.find(child); Object instanceObj; InstanceCookie ic = dataObj.getLookup().lookup(InstanceCookie.class); try { instanceObj = ic.instanceCreate(); } catch (IOException | ClassNotFoundException ex) { instanceObj = null; } if (instanceObj instanceof Action) { Action action = (Action) instanceObj; if (instanceObj instanceof Presenter.Toolbar) { Component component = ( (Presenter.Toolbar) instanceObj).getToolbarPresenter(); if (component instanceof JPanel) { // adding the component to toolbar but it never show toolbar.add(component); count++; continue; } } toolbar.add(createButton(action)); count++; } } catch (DataObjectNotFoundException ex) { Logger.getLogger(ToolbarComponentProvider.class.getName()).severe(ex.getMessage()); } } if (count > 0) { toolbar.add(new JSeparator(SwingConstants.VERTICAL)); toolbar.setFloatable(Boolean.TRUE.equals(parent.getAttribute("draggable"))); container.add(parent.getName(), toolbar); } } } return container; } } } Mark Reds