Modificar conteudo de um jpanel dentro de uma aba em JTabbedPane

Boa tarde.

pessoal, no momento estou usando um jtabbedpane pra mostrar itens em Abas e dentro de cada aba, as informacoes do item selecionado.

só que estou fazendo isso num único metodo.
eu crio um jtabbedpane, faço a consulta no banco e pra cada resultado(item) eu faço outra consulta.
dessa consulta eu pego os resultados(informacoes do item), adiciono num jpanel e adiciono a aba com o nome do item e o jpanel com suas informações.

mas está ficando muito pesado pra carregar e eu estou querendo mudar esse método mas não sei como.

a idéia eh o seguinte:
quando criar o jtabbedpane, so carregar as abas com os nomes dos itens e ao clicar na aba, chamo outro método que vai pegar as informações e adicionar num jpanel.

alguem sabe como eu posso fazer isso?

Grato
Irving Ellan

Você pode adicionar um changeListener no tabbedPane e dentro do método do listener pode saber qual o tabbedPane selecionado chamado o método tabbedPane.getSelectedIndex().

No exemplo abaixo que eu li num livro uma vez para testar este tipo de controle existe algo parecido:

package cap06;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class MyTabbedPane extends JFrame implements ActionListener{

	JTabbedPane tabbedPane = new JTabbedPane();
	JRadioButton radioTop = new JRadioButton("Top");
	JRadioButton radioLeft = new JRadioButton("Left");
	JRadioButton radioRight = new JRadioButton("Right");
	JRadioButton radioBottom = new JRadioButton("Bottom");
	JRadioButton radioWrap = new JRadioButton("WRAP TABS");
	JRadioButton radioScroll= new JRadioButton("SCROLL TABS");
	JButton btnAdd = new JButton("Add");
	JButton btnRemove = new JButton("Remove");
	int contTabs = 0;
	JLabel lblStatus = new JLabel("Selected Tab: ");
	
	public MyTabbedPane() {
		setSize(400,400);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		
		
		getContentPane().add( tabbedPane, BorderLayout.CENTER );
		
		JPanel panelButtonsStatus = new JPanel();
		panelButtonsStatus.setLayout(new BorderLayout());
		
		JPanel panelButtons = new JPanel();
		panelButtons.setLayout(new GridLayout(2,4));
		
		
		ButtonGroup group = new ButtonGroup();
		group.add(radioTop);
		group.add(radioLeft);
		group.add(radioRight);
		group.add(radioBottom);
		
		panelButtons.add(radioTop);
		panelButtons.add(radioLeft);
		panelButtons.add(radioRight);
		panelButtons.add(radioBottom);

		panelButtons.add(radioWrap);
		panelButtons.add(radioScroll);

		
		panelButtons.add(btnAdd);
		panelButtons.add(btnRemove);
		
		group = new ButtonGroup();
		group.add(radioWrap);
		group.add(radioScroll);

		
		
		btnAdd.addActionListener(this);
		btnRemove.addActionListener(this);
		radioTop.addActionListener(this);
		radioLeft.addActionListener(this);
		radioRight.addActionListener(this);
		radioBottom.addActionListener(this);
		radioWrap.addActionListener(this);
		radioScroll.addActionListener(this);
		
		panelButtonsStatus.add(panelButtons, BorderLayout.CENTER);
		panelButtonsStatus.add(lblStatus, BorderLayout.SOUTH);
		
		getContentPane().add(panelButtonsStatus, BorderLayout.SOUTH);
		
		ActionEvent evt = new ActionEvent(btnAdd, 0, "");
		for(int i = 0; i < 10; i++) {
			actionPerformed(evt);
		}
		tabbedPane.addChangeListener(new ChangeListener() {
			
			@Override
			public void stateChanged(ChangeEvent evt) {
				setStatus();
			}
		});
		
		setStatus();
	}
	
	private void setStatus(){
		if(contTabs > 0) {
			lblStatus.setText("Selected Tab: " +  tabbedPane.getSelectedIndex());
		} else {
			lblStatus.setText("Selected Tab: none " );
		}
	}
	
	public static void main(String[] args) {
		new MyTabbedPane().setVisible(true);
	}


	@Override
	public void actionPerformed(ActionEvent evt) {
		if(evt.getSource() == btnAdd) {
			tabbedPane.addTab( ("Tab " + (contTabs)), new JLabel("Label: " + contTabs++));
		} else if( evt.getSource() == btnRemove && contTabs > 0) {
			tabbedPane.remove(--contTabs);
			setStatus();
		} else if( evt.getSource() == radioTop) {
			tabbedPane.setTabPlacement(SwingConstants.TOP);
		} else if( evt.getSource() == radioLeft) {
			tabbedPane.setTabPlacement(SwingConstants.LEFT);
		} else if( evt.getSource() == radioRight) {
			tabbedPane.setTabPlacement(SwingConstants.RIGHT);
		} else if( evt.getSource() == radioBottom) {
			tabbedPane.setTabPlacement(SwingConstants.BOTTOM);
		} else if( evt.getSource() == radioScroll) {
			tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
		} else if( evt.getSource() == radioWrap) {
			tabbedPane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
		}
	}
	
	
}

Olá, Rogério.

bem, eu ja tentei fazer isso, mas quando funciona, os nomes das abas comecam a ficar trocados, vai ficando um igual ao outro e tal…
ou então da uma excessão que eu nao encontrei resposta…

ta mais o menos assim:

TabbedPanel.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                System.out.println("Aba Selecionada = " + TabbedPanel.getSelectedIndex());
                JPanel jpanelTeste = new JPanel();
                jpanelTeste.add(new JLabel("oii"));
                TabbedPanel.add(jpanelTeste, TabbedPanel.getSelectedIndex());
            }
        });

Obrigado.

Bom, eu não sei como está o seu código, mas se você olhar no exemplo vai ver que existe apenas um jlabel que mostra a aba selecionada, e não um jlabel para cada aba. Este JLabel é criado apenas uma vez quando o programa é incializado, e não várias vezes. A idéia seria a mesma no seu caso, só que ao invés de um jlabel poderia ser um JPanel, por exemplo. Ao clicar na aba você limpa todos os controles deste jpanel e adiciona os novos de acordo com a aba selecionada. O JPanel já estaria lá, você não precisaria ficar criando ele no método do listener. Você apenas trocaria o conteúdo dele de acordo com a aba selecionada.

Olá Rogério.

realmente, eu olhei novamente o código e entendi.

mas no meu caso, eu tenho uma classe JPanel, que recebe um objeto e cria vários JLabel pra cada informação que quero mostrar de acordo com o número de informações que vier do objeto.
estou até usando flowLayout pq os dados variam, as vezes o usuario não cadastrou muita coisa, entendeu?

minha idéia era tentar chamar essa classe e adicionar quando selecionado a aba.

mas desse maneira que voce sugeriu eu não estou conseguindo pensar num jeito de fazer isso.

alguma sugestão?

Obrigado.

Bom, você poderia criar uma classe estendendo a classe JPanel com um método para popular o JPanel com os dados do seu objeto, ao invés de fazer isso no construtor, por exemplo. Depois, quando o usuário seleciona a aba, você chama o método removeAll() do JPanel para remover os constroles e chama novamente o método que cria os controles passando o objeto referente à aba selecionada. Assim vc utiliza uma instância apenas do seu JPanel que é alterada de acordo com o objeto. Depois vc limpa todos os componentes das tabs (pois o mesmo componente só pode ser utilizado em uma tab), chama o método que cria os componente passando o seu objeto e seta o componente referente à tab selecionada. Eu adaptei o exemplo anterior para fazer algo parecido (só que no meu caso, ao invés de adicionar de acordo com um objeto, eu adicionei um número de componentes igual ao índice da aba + 1):


package cap06;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class MyTabbedPane extends JFrame implements ActionListener{

	JTabbedPane tabbedPane = new JTabbedPane();
	JRadioButton radioTop = new JRadioButton("Top");
	JRadioButton radioLeft = new JRadioButton("Left");
	JRadioButton radioRight = new JRadioButton("Right");
	JRadioButton radioBottom = new JRadioButton("Bottom");
	JRadioButton radioWrap = new JRadioButton("WRAP TABS");
	JRadioButton radioScroll= new JRadioButton("SCROLL TABS");
	JButton btnAdd = new JButton("Add");
	JButton btnRemove = new JButton("Remove");
	int contTabs = 0;
	JLabel lblStatus = new JLabel("Selected Tab: ");
	JPanel panelControls = new JPanel();
	
	public MyTabbedPane() {
		setSize(400,400);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		
		
		getContentPane().add( tabbedPane, BorderLayout.CENTER );
		
		JPanel panelButtonsStatus = new JPanel();
		panelButtonsStatus.setLayout(new BorderLayout());
		
		JPanel panelButtons = new JPanel();
		panelButtons.setLayout(new GridLayout(2,4));
		
		
		ButtonGroup group = new ButtonGroup();
		group.add(radioTop);
		group.add(radioLeft);
		group.add(radioRight);
		group.add(radioBottom);
		
		panelButtons.add(radioTop);
		panelButtons.add(radioLeft);
		panelButtons.add(radioRight);
		panelButtons.add(radioBottom);

		panelButtons.add(radioWrap);
		panelButtons.add(radioScroll);

		
		panelButtons.add(btnAdd);
		panelButtons.add(btnRemove);
		
		group = new ButtonGroup();
		group.add(radioWrap);
		group.add(radioScroll);

		
		
		btnAdd.addActionListener(this);
		btnRemove.addActionListener(this);
		radioTop.addActionListener(this);
		radioLeft.addActionListener(this);
		radioRight.addActionListener(this);
		radioBottom.addActionListener(this);
		radioWrap.addActionListener(this);
		radioScroll.addActionListener(this);
		
		panelButtonsStatus.add(panelButtons, BorderLayout.CENTER);
		panelButtonsStatus.add(lblStatus, BorderLayout.SOUTH);
		
		
		
		getContentPane().add(panelButtonsStatus, BorderLayout.SOUTH);
		
		ActionEvent evt = new ActionEvent(btnAdd, 0, "");
		for(int i = 0; i < 10; i++) {
			actionPerformed(evt);
		}
		
		
		tabbedPane.addChangeListener(new ChangeListener() {
			
			@Override
			public void stateChanged(ChangeEvent evt) {
				setStatus();
			}
		});
		
		
		
		setStatus();
	}
	
	private void setStatus(){
		if(contTabs > 0) {
			
			//Limpa o componente das abas pois o componente pode ser utilizado apenas uma vez
			for(int i = 0; i < tabbedPane.getTabCount(); i++) {
				tabbedPane.setComponentAt(i, null);
			}
			
			lblStatus.setText("Selected Tab: " +  tabbedPane.getSelectedIndex());
			
			//Monta novamente o painel de controles com um número de campos igual ao índice da aba + 1
			panelControls.removeAll();
			int irnd = tabbedPane.getSelectedIndex() + 1;
			panelControls.setLayout(new GridLayout(irnd, 2));
			for(int i = 0; i < irnd; i++) {
				panelControls.add(new JLabel("Field " + i + ": "));
				panelControls.add(new JTextField(10));
			}
			tabbedPane.setComponentAt(tabbedPane.getSelectedIndex(), panelControls);
			
		} else {
			lblStatus.setText("Selected Tab: none " );
		}
	}
	
	public static void main(String[] args) {
		new MyTabbedPane().setVisible(true);
	}


	@Override
	public void actionPerformed(ActionEvent evt) {
		if(evt.getSource() == btnAdd) {
			tabbedPane.addTab( ("Tab " + (contTabs)), null);
			//tabbedPane.addTab( ("Tab " + (contTabs)), new JPanel());
			contTabs++;
		} else if( evt.getSource() == btnRemove && contTabs > 0) {
			tabbedPane.remove(--contTabs);
			setStatus();
		} else if( evt.getSource() == radioTop) {
			tabbedPane.setTabPlacement(SwingConstants.TOP);
		} else if( evt.getSource() == radioLeft) {
			tabbedPane.setTabPlacement(SwingConstants.LEFT);
		} else if( evt.getSource() == radioRight) {
			tabbedPane.setTabPlacement(SwingConstants.RIGHT);
		} else if( evt.getSource() == radioBottom) {
			tabbedPane.setTabPlacement(SwingConstants.BOTTOM);
		} else if( evt.getSource() == radioScroll) {
			tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
		} else if( evt.getSource() == radioWrap) {
			tabbedPane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
		}
	}
	
	
}

Obrigado pelas respostas, Rogério.

mas eu tenho outra dúvida

dentro da aba selecionada, no jpanel, eu tenho um botão de editar.
quando eu edito e salvo, o conteudo do jpanel dentro da aba não muda.

como eu poderia fazer uma ação pra atualizar apenas o conteudo do jpanel da aba selecionada?

Obrigado.

Olá.

Alguem sabe responder minha dúvida?

Obrigado.