@Override
 protected void presentationPropertyChanded(PropertyChangeEvent e) {
   super.presentationPropertyChanded(e);
   if (Presentation.PROP_TEXT.equals(e.getPropertyName())) {
     revalidate(); // recalc preferred size & repaint instantly
   }
 }
 public void propertyChange(PropertyChangeEvent evt) {
   String propertyName = evt.getPropertyName();
   if (Presentation.PROP_TEXT.equals(propertyName)) {
     setText((String) evt.getNewValue());
     updateButtonSize();
   } else if (Presentation.PROP_DESCRIPTION.equals(propertyName)) {
     updateTooltipText((String) evt.getNewValue());
   } else if (Presentation.PROP_ICON.equals(propertyName)) {
     setIcon((Icon) evt.getNewValue());
     updateButtonSize();
   } else if (Presentation.PROP_ENABLED.equals(propertyName)) {
     setEnabled(((Boolean) evt.getNewValue()).booleanValue());
   }
 }
    @Override
    public void propertyChange(PropertyChangeEvent e) {
      boolean queueForDispose = getParent() == null;

      String name = e.getPropertyName();
      if (mySynchronized.contains(name)) return;

      mySynchronized.add(name);

      try {
        if (Presentation.PROP_VISIBLE.equals(name)) {
          final boolean visible = myPresentation.isVisible();
          if (!visible && SystemInfo.isMacSystemMenu && myPlace.equals(ActionPlaces.MAIN_MENU)) {
            setEnabled(false);
          } else {
            setVisible(visible);
          }
        } else if (Presentation.PROP_ENABLED.equals(name)) {
          setEnabled(myPresentation.isEnabled());
          updateIcon(myAction.getAction());
        } else if (Presentation.PROP_MNEMONIC_KEY.equals(name)) {
          setMnemonic(myPresentation.getMnemonic());
        } else if (Presentation.PROP_MNEMONIC_INDEX.equals(name)) {
          setDisplayedMnemonicIndex(myPresentation.getDisplayedMnemonicIndex());
        } else if (Presentation.PROP_TEXT.equals(name)) {
          setText(myPresentation.getText());
        } else if (Presentation.PROP_ICON.equals(name)
            || Presentation.PROP_DISABLED_ICON.equals(name)
            || SELECTED.equals(name)) {
          updateIcon(myAction.getAction());
        }
      } finally {
        mySynchronized.remove(name);
        if (queueForDispose) {
          // later since we cannot remove property listeners inside event processing
          //noinspection SSBasedInspection
          SwingUtilities.invokeLater(
              new Runnable() {
                @Override
                public void run() {
                  if (getParent() == null) {
                    uninstallSynchronizer();
                  }
                }
              });
        }
      }
    }