Substance client properties

View all API methods.

View all client properties.


Client property name

SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION

Description

Client property name for specifying that only the close button of a marked-as-modified tab component should pulsate. This property can be specified on a single tab component, on a JTabbedPane itself (will hold for all tab components that don't define this property) or on UIManager. The value should be either Boolean.TRUE or Boolean.FALSE. By default, the animation on modified tabs is on the entire tab rectangle. Note that this setting is only relevant for tabs marked with SubstanceLookAndFeel.WINDOW_MODIFIED property.


See also


Sample code

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

import org.pushingpixels.substance.api.SubstanceLookAndFeel;
import org.pushingpixels.substance.api.skin.BusinessBlackSteelSkin;

/**
 * Test application that shows the use of the
 {@link SubstanceLookAndFeel#TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION}
 * client property.
 
 @author Kirill Grouchnikov
 @see SubstanceLookAndFeel#TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION
 */
public class TabbedPaneCloseButtonsModifiedAnimation extends JFrame {
  /**
   * Creates the main frame for <code>this</code> sample.
   */
  public TabbedPaneCloseButtonsModifiedAnimation() {
    super("Tabbed pane close buttons modified animation");

    this.setLayout(new BorderLayout());

    // create a tabbed pane with few tabs
    final JTabbedPane jtp = new JTabbedPane();
    jtp.addTab("First"new JPanel());
    jtp.addTab("Second"new JPanel());
    // mark the tabbed pane to have close buttons on all tabs
    jtp.putClientProperty(
        SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_PROPERTY,
        Boolean.TRUE);
    this.add(jtp, BorderLayout.CENTER);

    JPanel controls = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    final JCheckBox firstTabModified = new JCheckBox("First tab modified");
    firstTabModified.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        Component comp = jtp.getComponentAt(0);
        // based on the checkbox selection, mark the first tab component
        // to have modified contents
        ((JComponentcomp).putClientProperty(
            SubstanceLookAndFeel.WINDOW_MODIFIED, firstTabModified
                .isSelected() ? Boolean.TRUE : null);
        jtp.repaint();
      }
    });

    final JCheckBox animationOnCloseButton = new JCheckBox(
        "Animation on close button");
    animationOnCloseButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        // based on the checkbox selection, mark the tabbed pane to have
        // modified animations on the close button only
        jtp
            .putClientProperty(
                SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION,
                animationOnCloseButton.isSelected() ? Boolean.TRUE
                    null);
        jtp.repaint();
      }
    });

    controls.add(firstTabModified);
    controls.add(animationOnCloseButton);
    this.add(controls, BorderLayout.SOUTH);

    this.setSize(400200);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  /**
   * The main method for <code>this</code> sample. The arguments are ignored.
   
   @param args
   *            Ignored.
   */
  public static void main(String[] args) {
    JFrame.setDefaultLookAndFeelDecorated(true);
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        SubstanceLookAndFeel.setSkin(new BusinessBlackSteelSkin());
        new TabbedPaneCloseButtonsModifiedAnimation().setVisible(true);
      }
    });
  }
}

The screenshot below shows tabbed pane with first tab marked as modified (with WINDOW_MODIFIED property). The modified animation is on the entire tab (this property is not set):

The screenshot below shows tabbed pane with first tab marked as modified (with WINDOW_MODIFIED property) and marked with this property set to Boolean.TRUE. Note that the mouse cursor is over the close button itself to show the animation colors: