Tamanho da aba do JTabbedPane [RESOLVIDO]

Olá, pessoal. Tudo bem?

É o seguinte, estou usando um JTabbedPane que fica orientado ao lado esquerdo da tela, só que o tamanho do título da aba aumenta e diminui de acordo com o texto digitado. Exemplificando, se eu crio uma aba com o título de “aba1” a aba fica pequena e o tamanho do painel fica grande, se eu boto um título como “Teste da Aba de número 1”, a aba fica grande e diminui o espaço do painel. Como eu quero definir um padrão para o tamanho do JPanel, isto está me atrapalhando.

Não sei se expliquei o problema bem, então, resumindo: gostaria de saber como faço para definir um tamanho padrão para o título da aba de um um JTabbedPane, para não depender de quantas letras eu digito.

Desde já, agradeço a atenção.

olá onyaszimba,

Talvez isso possa te ajudar:
http://terai.xrea.jp/Swing/ClippedTabLabel.html

Olá, Joel. Tudo bem?

Valeu pela dica, era exatamente o que eu procurava. Sabia que ia ter que criar um componente para isso. Só que o código está com um problema de NullPointerException que eu ainda estou tentando resolver. Assim que ficar pronto eu posto aqui. Ok?

Obrigado.

vc baixou os fontes disponibilizados no endereço?
(http://terai.xrea.jp/swing/clippedtablabel/src.zip)

Eu já fiz uns testes aqui com esse código e não tive problemas.

Hehe, o site é em japonês, nem percebi que tinha o código para baixar. Agora já baixei e funcionou mesmo, só que não consegui trazer para a minha aplicação, ele continua com esse erro de NullPointerException.

Vou dar uma olhada esta manhã, eu devo ter deixado escapar alguma coisa, assim que resolver o problema eu posto aqui. Valeu pela ajuda!

Então, resolvido o problema, aqui estou para postar o código - verdade que não ficou nada diferente do exemplo que o Joel me passou, mas funciona:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.plaf.synth.Region;
import javax.swing.plaf.synth.SynthConstants;
import javax.swing.plaf.synth.SynthContext;
import javax.swing.plaf.synth.SynthLookAndFeel;
import javax.swing.plaf.synth.SynthStyle;

/**
 * 
 * 
 * @author Onyas D. Claudio
 */
public class MyTabbedPane extends JTabbedPane {


    /** Variável que verifica se o componentejá foi iniciado. */
    private boolean componenteIniciado = false;


    public MyTabbedPane() {
        super();
        addComponentListener(new ComponentAdapter() {
            @Override public void componentResized(ComponentEvent e) {
                if(!componenteIniciado) {
                    initTabWidth();
                    componenteIniciado = true;
                } // Fim do if
            } // Fim do método componentResized
        });
    } // Fim do construtor

    /**
     * Retorna o <code>Insets</code> da aba, os limites dela.
     *
     * @return um objeto <code>Insetx</code> com os limites da aba.
     */
    private Insets getTabInsets() {
        Insets insets = UIManager.getInsets("TabbedPane.tabInsets");
        if(insets != null) {
            return insets;
        } else {
            SynthStyle estilo = SynthLookAndFeel.getStyle(this,
                    Region.TABBED_PANE_TAB);
            SynthContext contexto = new SynthContext(this, Region.TABBED_PANE_TAB,
                    estilo, SynthConstants.ENABLED);
            return estilo.getInsets(contexto, null);
        } // Fim do if/else
    } // Fim do método getTabInsets

    /**
     * Retorna o <code>Insets</code> da área da aba, os limites dela.
     *
     * @return um objeto <code>Insetx</code> com os limites da área da aba.
     */
    private Insets getTabAreaInsets() {
        Insets insets = UIManager.getInsets("TabbedPane.tabAreaInsets");
        if(insets != null) {
            return insets;
        } else {
            SynthStyle estilo = SynthLookAndFeel.getStyle(this,
                    Region.TABBED_PANE_TAB_AREA);
            SynthContext contexto = new SynthContext(this,
                    Region.TABBED_PANE_TAB_AREA, estilo, SynthConstants.ENABLED);
            return estilo.getInsets(contexto, null);
        } // Fim do if/else
    } // Fim do método getTabAreaInsets

    /**
     * Inicializa a largura da aba.
     */
    private void initTabWidth() {
        int tabCount = getTabCount();
        if(tabCount == 0) return;
        Insets tabInsets = this.getTabInsets();
        Insets tabAreaInsets = this.getTabAreaInsets();
        Insets insets = getInsets();
        int areaWidth = getWidth() - tabAreaInsets.left - tabAreaInsets.right -
                insets.left - insets.right;
        int tabWidth = 0; // = tabInsets.left + tabInsets.right + 3;
        int gap = 0;

        switch(getTabPlacement()) {
          case LEFT: case RIGHT:
            tabWidth = areaWidth / 4;
            gap = 0;
            break;
          case BOTTOM: case TOP: default:
            tabWidth = areaWidth / tabCount;
            gap = areaWidth - (tabWidth * tabCount);
        } // Fim do switch
        // Define a largura da aba
        tabWidth = tabWidth - tabInsets.left - tabInsets.right - 3; // ESTE 3 DEFINE O TAMANHO FIXO DA ABA!!
        for(int i = 0; i < tabCount; i++) {
            JLabel label = (JLabel)getTabComponentAt(i);
            if(label == null) break;
            label.setPreferredSize(new Dimension(tabWidth + (i < gap ? 1 : 0),
                    label.getPreferredSize().height));
        } // Fim do for
    } // Fim do método initTabWidth

    /** Repinta o componente. */
    @Override
    public synchronized void repaint() {
        initTabWidth();
        super.repaint();
    } // Fim do método repaint

    /**
     * Insere uma nova aba no painel tabulado.
     * 
     * @param titulo o título da aba.
     * @param icone o ícone da aba
     * @param componente o componente da aba.
     * @param tooltip o texto tooltip da aba.
     * @param indice o índice da aba na lista de painéis.
     */
    @Override
    public void insertTab(String titulo, Icon icone, Component componente,
            String tooltip, int indice) {
        super.insertTab(titulo, icone, componente,
                tooltip == null ? titulo : tooltip, indice);
        JLabel label = new JLabel(titulo, JLabel.CENTER);
        Dimension dim = label.getPreferredSize();
        Insets tabInsets = getTabInsets();
        label.setPreferredSize(new Dimension(0, dim.height + tabInsets.top +
                tabInsets.bottom));
        setTabComponentAt(indice, label);
    } // Fim do método insertTab

    
} // Fim da classe MyTabbedPane

Foi criada uma nova classe que extende o JTabbedPane, definindo e sobrescrevendo alguns métodos.

Assim, as abas ficam com um tamanho fixo definido no método initTabWidth. Modificações podem ser feitas, como utilizar uma porcentagem para aumentar e diminuir o tamanho. Eu fiz isso aqui, mas postei o código mais simples para não complicar.

Valeu, Joel, pela ajuda.

onyaszimba, essa classe ficou muito boa, mais pessoas irão reaproveitar, parabens.

Valeu, Joel. Foi mais Ctrl+C do que mérito meu, mas tudo bem, hehe.

É incrível como o painel tabulado fica bonito alinhado à esquerda da tela, é um recurso muito interessante.