Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Componentes / Java / Look and Feel / Libreria swing BlackTabbedPane

Libreria swing BlackTabbedPane

Por jc mouse viernes, enero 11, 2013

Continuación del tutorial [Personalizar JTabbedPane con Netbeans].

La clase BlackTabbedPaneUI que extendemos de BasicTabbedPaneUI, nos da la posibilidad de sobre escribir métodos propios de esta clase para dar un aspecto diferente a los Tabs (pestañas) y al Contenido del swing JTabbedPane. Para una descripción completa de todas los métodos y propiedades de esta clase, sugiero visitar el API Java Class BasicTabbedPaneUI.

Para este sencillo ejemplo solo necesitamos sobre escribir 3 métodos:

partes jtabbedpane

  1. paintTabBackground. Este método es el encargado de pintar el fondo de una pestaña (Tabs).
  2. paintTabBorder. Como su nombre indica, pinta el borde de una pestaña (Tabs ).
  3. paintContentBorder. Este metodo pinta el borde del contenedor del JTabbedPane.

Antes, dentro la clase declaramos tres variables de tipo Color, ColorSel para el color del Tabs en estado seleccionado, ColorUnSel para los colores de los tabs no seleccionados y colorContentBorder para el color de borde del contenedor.

    public Color colorSel = new Color(0, 0, 0);
    public Color colorUnSel = new Color(192, 192, 192);
    public  Color colorContentBorder = colorSel;

Haciendo uso de java2d pintamos un rectángulo en las coordenadas X,Y  dadas por la propia clase. Este método pinta todos los tabs que tenga el swing, es por eso que se debe hacer una distinción de que tab se esta pintando, si esta seleccionado o no, para eso la propiedad booleana isSelected  nos indica tal estado.

    @Override
    protected void paintTabBackground( Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected ) 
    {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor( (isSelected)? colorSel : colorUnSel );        
        g2.fillRect(rects[tabIndex].x, rects[tabIndex].y, 
                    rects[tabIndex].width, rects[tabIndex].height);    
    }

Para  pintar el borde, de igual modo, utilizando java2d, pintamos un rectángulo (solo el borde) en las coordenadas (x,y) y (w,h) para el ancho y alto del tab.

    @Override
    protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) 
    {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor( (isSelected)? colorSel : colorUnSel );        
        g2.drawRect(x, y, w, h);
    }

Para terminar, pintamos el borde del contenedor, aquí tenemos que tener en cuenta que un JTabbedPane tiene 4 formas de disponer las pestañas, TOP, BOTTOM, LEFT, RIGHT, y de acuerdo a su posición las coordenadas x, y y el ancho y alto del contendor, así como de los propios tabs, varia. como los tabs son rectangulares no hay problema, para el  contenedor, se deben hacer unos pequeños cálculos. Finalmente pintamos un rectángulo con las variables (x,y,w,h)

    @Override
    protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex ) 
    {
        int width = tabPane.getWidth();
        int height = tabPane.getHeight();
        Insets insets = tabPane.getInsets();      

       int x = insets.left;
       int y = insets.top;
       int w = width - insets.right - insets.left;
       int h = height - insets.top - insets.bottom;

        switch(tabPlacement) 
        {
           case LEFT:
              x += calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth);              
              x -= tabAreaInsets.right;              
              w -= (x - insets.left);
              break;
          case RIGHT:
              w -= calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth);              
              w += tabAreaInsets.left;              
              break;
          case BOTTOM:
              h -= calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight);              
              h += tabAreaInsets.top;
              break;
          case TOP:
          default:
              y += calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight);              
              y -= tabAreaInsets.bottom;              
              h -= (y - insets.top);
        }

        if ( tabPane.getTabCount() > 0  )                
        {            
           Color color = UIManager.getColor("TabbedPane.contentAreaColor");
           if (color != null) {
               g.setColor(color);
           }
           else if ( colorContentBorder == null || selectedIndex == -1 ) {
               g.setColor(tabPane.getBackground());
           }
           else {
               g.setColor(colorContentBorder);
           }
           g.fillRect(x,y,w,h);
        }
    }

La clase completa queda de la siguiente forma:

package org.matrix;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class BlackTabbedPaneUI extends BasicTabbedPaneUI  {

    public Color colorSel = new Color(0, 0, 0);
    public Color colorUnSel = new Color(192, 192, 192);
    public  Color colorContentBorder = colorSel;    

    @Override
    protected void paintTabBackground( Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected ) 
    {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor( (isSelected)? colorSel : colorUnSel );        
        g2.fillRect(rects[tabIndex].x, rects[tabIndex].y, 
                    rects[tabIndex].width, rects[tabIndex].height);    
    }

    @Override
    protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) 
    {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor( (isSelected)? colorSel : colorUnSel );        
        g2.drawRect(x, y, w, h);
    }

    @Override
    protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex ) 
    {
        int width = tabPane.getWidth();
        int height = tabPane.getHeight();
        Insets insets = tabPane.getInsets();      

       int x = insets.left;
       int y = insets.top;
       int w = width - insets.right - insets.left;
       int h = height - insets.top - insets.bottom;

        switch(tabPlacement) 
        {
           case LEFT:
              x += calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth);              
              x -= tabAreaInsets.right;              
              w -= (x - insets.left);
              break;
          case RIGHT:
              w -= calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth);              
              w += tabAreaInsets.left;              
              break;
          case BOTTOM:
              h -= calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight);              
              h += tabAreaInsets.top;
              break;
          case TOP:
          default:
              y += calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight);              
              y -= tabAreaInsets.bottom;              
              h -= (y - insets.top);
        }

        if ( tabPane.getTabCount() > 0  )                
        {            
           Color color = UIManager.getColor("TabbedPane.contentAreaColor");
           if (color != null) {
               g.setColor(color);
           }
           else if ( colorContentBorder == null || selectedIndex == -1 ) {
               g.setColor(tabPane.getBackground());
           }
           else {
               g.setColor(colorContentBorder);
           }
           g.fillRect(x,y,w,h);
        }
    }

}

La clase BlackTabbedPaneUI, se debe implementar en la clase BlackTabbedPane, asi tambien, completar los métodos SET y GET, la clase final queda de la siguiente forma:

package org.matrix;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JTabbedPane;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class BlackTabbedPane extends JTabbedPane {

    BlackTabbedPaneUI blackTabbedPaneUI = new BlackTabbedPaneUI();
    /**
 * Constructor de clase
 */
    public BlackTabbedPane(){
        this.setPreferredSize( new Dimension(100,100) );
        this.setForeground(new Color(255, 255, 255));
        this.setUI( blackTabbedPaneUI );
        this.setVisible(true);
    }

    public void setTabSelectedColor( Color color )
    {
        blackTabbedPaneUI.colorSel = color;
        blackTabbedPaneUI.colorContentBorder=color;
    }

    public Color getTabSelectedColor()
    {        
        return ( blackTabbedPaneUI.colorSel==null)? new Color(0,0,0): blackTabbedPaneUI.colorSel ;
    }

    public void setTabUnselectedColor( Color color )
    {
        blackTabbedPaneUI.colorUnSel = color;        
    }

    public Color getTabUnselectedColor()
    {        
        return ( blackTabbedPaneUI.colorUnSel==null)? new Color(192,192,192): blackTabbedPaneUI.colorUnSel ;
    }

}//-->

Ya solo nos queda crear el *.jar, clic derecho sobre el nombre del proyecto y CLEAN AND BUILD. con eso ya tenemos lista nuestra librería JTabbedPane. Para instalar y utilizar este swing desde netbeans, lee el siguiente tutorial [Añadir/Instalar nuevas librerias a Netbeans].

black tabs java

Bajate el proyecto completo en netbeans 7.2 HERE :=D

Si te quedo en alguna duda, preguuuuuuuuuuuuuntame 🙂

enjoy!!!

Tags

Artículos similares

Crear un Exe para programas Java con JavaExe

En este videotutorial veremos la forma de crear un ejecutable para programas hechos en lenguaje Java con el software Jav[...]

Descargar archivos de Internet con Java

En este post veremos un ejemplo sencillo de como descargar desde Internet archivos de cualquier tipo (*.jpg, *.png, *.gi[...]

Java Webservices – Servicios Web

Un servicio web (Web Services) es un sistema de software en la web que nos ofrece la posibilidad de realizar una o múlti[...]

Configurar Chrome para usar Tor

Tor es la forma más fácil de navegar por internet de una manera segura y anónima,  Tor cuenta con su propio navegador «T[...]

Convierte tus dibujos web en Código HTML

Sketch2Code es un proyecto de Microsoft el cual usa IA (Inteligencia Artificial) para transformar el diseño de una inter[...]

Introducción a la edición de imágenes con ImageMagick

ImageMagick es un software de código abierto multiplataforma que contiene una serie de herramientas para leer, mostrar,[...]