Substance client properties

View all API methods.

View all client properties.

Client property name



Client property name for specifying the callback for deciding on the tab close type. 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 an instance of TabCloseCallback. Note that this setting is only relevant for tabs marked with SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_PROPERTY property.

See also

Sample code

import java.awt.BorderLayout;
import java.awt.event.MouseEvent;

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.SubstanceConstants.TabCloseKind;
import org.pushingpixels.substance.api.tabbed.TabCloseCallback;

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

    this.setLayout(new BorderLayout());

    // create tabbed pane with a few tabs
    final JTabbedPane jtp = new JTabbedPane();
    jtp.addTab("First"new JPanel());
    jtp.addTab("Second"new JPanel());
    jtp.addTab("Third"new JPanel());
    // mark it to have close buttons on all the tabs

    this.add(jtp, BorderLayout.CENTER);

    // create a custom implementation of TabCloseCallback interface.
    TabCloseCallback closeCallback = new TabCloseCallback() {
      public TabCloseKind onAreaClick(JTabbedPane tabbedPane,
          int tabIndex, MouseEvent mouseEvent) {
        if (mouseEvent.getButton() != MouseEvent.BUTTON3)
          return TabCloseKind.NONE;
        if (mouseEvent.isShiftDown()) {
          return TabCloseKind.ALL;
        return TabCloseKind.THIS;

      public TabCloseKind onCloseButtonClick(JTabbedPane tabbedPane,
          int tabIndex, MouseEvent mouseEvent) {
        if (mouseEvent.isAltDown()) {
          return TabCloseKind.ALL_BUT_THIS;
        if (mouseEvent.isShiftDown()) {
          return TabCloseKind.ALL;
        return TabCloseKind.THIS;

      public String getAreaTooltip(JTabbedPane tabbedPane, int tabIndex) {
        return null;

      public String getCloseButtonTooltip(JTabbedPane tabbedPane,
          int tabIndex) {
        StringBuffer result = new StringBuffer();
        result.append("Mouse click closes <b>"
            + tabbedPane.getTitleAt(tabIndex"</b> tab");
            .append("<br><b>Alt</b>-Mouse click closes all tabs but <b>"
                + tabbedPane.getTitleAt(tabIndex"</b> tab");
        result.append("<br><b>Shift</b>-Mouse click closes all tabs");
        return result.toString();

    // register the callback on the tabbed pane


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

The screenshot below shows tabbed pane with custom close callback installed. The mouse hovers over the close button of the first tab.