Olá amigos, estou usando essa classe que peguei na net, ( acho que foi aqui no fórum ) para adicionar um botão de fechar em uma aba de um JTabbedPane.
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
import java.awt.event.*;
public class ButtonTabComponent extends JPanel {
private final JTabbedPane pane;
//
//CONSTRUTOR
//
//Início...
public ButtonTabComponent(final JTabbedPane pane) {
//unset default FlowLayout' gaps
super(new FlowLayout(FlowLayout.LEFT, 0, 0));
if (pane == null) {
throw new NullPointerException("TabbedPane is null");
}
this.pane = pane;
setOpaque(false);
//faz a JLabel ler o título do JTabbedPane
JLabel label = new JLabel() {
public String getText() {
int i = pane.indexOfTabComponent(ButtonTabComponent.this);
if (i != -1) {
return pane.getTitleAt(i);
}
return null;
}
};
add(label);
//adiciona mais espaço entre a label e o botão
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
//tab button
JButton button = new TabButton();
add(button);
//adiciona mais espaço para o topo do componente
setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
}//Fim do construtor.
//
//CLASSE TABBUTTON
//
//Define as características do botão fechar.
//
//Início
private class TabButton extends JButton implements ActionListener {
public TabButton() {
int size = 17;
setPreferredSize(new Dimension(size, size));
setToolTipText("Fechar esta aba!");
//Faz o botão ser igual para todas as Laf's
setUI(new BasicButtonUI());
//Torna-o transparente
setContentAreaFilled(false);
//Não necessidade de estar com focusable
setFocusable(false);
setBorder(BorderFactory.createEtchedBorder());
setBorderPainted(false);
//Fazendo um efeito de rolagem
//usamos o mesmo listener para todos os botões
addMouseListener(buttonMouseListener);
setRolloverEnabled(true);
//Fecha a guia apropriada, clicando no botão
addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
int i = pane.indexOfTabComponent(ButtonTabComponent.this);
if (i != -1) {
pane.removeTabAt(i);
}
}
//pinta o X
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
//mudança na imagem para botões pressionados
if (getModel().isPressed()) {
g2.translate(1, 1);
}
g2.setStroke(new BasicStroke(2));
g2.setColor(Color.BLACK);
if (getModel().isRollover()) {
g2.setColor(Color.MAGENTA);
}
int delta = 6;
g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
g2.dispose();
}
}//Fim da classe TabButton.
//
//MOUSELISTENER
//
//Define os eventos de entrada e saida do mouse.
//
//Início...
private final static MouseListener buttonMouseListener = new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
Component component = e.getComponent();
if (component instanceof AbstractButton) {
AbstractButton button = (AbstractButton) component;
button.setBorderPainted(true);
}
}
public void mouseExited(MouseEvent e) {
Component component = e.getComponent();
if (component instanceof AbstractButton) {
AbstractButton button = (AbstractButton) component;
button.setBorderPainted(false);
}
}
};//Fim dos Listeners.
}
adicionar nova tab
public void actionPerformed(ActionEvent e) {
if (novoPanelTab(panelUsuario)){
panelUsuario = new PanelUsuario();
jTabbedPane1.addTab(" Dados do Usuário ",panelUsuario);
jTabbedPane1.setSelectedComponent(panelUsuario);
adicionarBotaoPanel();
}
método novoPanelTab
private boolean novoPanelTab(JPanel painel) {
if ( painel != null){
jTabbedPane1.setSelectedComponent(painel);
return false;
return true;
}
O problema é que ao fechar uma aba parece que ela é apenas setada para não ficar visível e ocorre erro ao tentar reabrir a aba.
Ele não seta como null e gera erro ao executar esse código
jTabbedPane1.setSelectedComponent(painel);
Erro
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: component not found in tabbed pane
at javax.swing.JTabbedPane.setSelectedComponent(JTabbedPane.java:659)
at com.br.jkb.visual.FrameInicial.novoPanelTab(FrameInicial.java:700)
at com.br.jkb.visual.FrameInicial.access$500(FrameInicial.java:35)
at com.br.jkb.visual.FrameInicial$EventoPanelCliente.actionPerformed(FrameInicial.java:151)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at org.jdesktop.swingx.JXHyperlink.fireActionPerformed(JXHyperlink.java:264)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)