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á, 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.