Modificar conteudo de um jpanel dentro de uma aba em JTabbedPane
7 respostas
I
irvingellan
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.
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:
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…
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.
I
irvingellan
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.
R
rogeriopaguilar
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):
packagecap06;importjava.awt.BorderLayout;importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.ButtonGroup;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JRadioButton;importjavax.swing.JTabbedPane;importjavax.swing.JTextField;importjavax.swing.SwingConstants;importjavax.swing.event.ChangeEvent;importjavax.swing.event.ChangeListener;publicclassMyTabbedPaneextendsJFrameimplementsActionListener{JTabbedPanetabbedPane=newJTabbedPane();JRadioButtonradioTop=newJRadioButton("Top");JRadioButtonradioLeft=newJRadioButton("Left");JRadioButtonradioRight=newJRadioButton("Right");JRadioButtonradioBottom=newJRadioButton("Bottom");JRadioButtonradioWrap=newJRadioButton("WRAP TABS");JRadioButtonradioScroll=newJRadioButton("SCROLL TABS");JButtonbtnAdd=newJButton("Add");JButtonbtnRemove=newJButton("Remove");intcontTabs=0;JLabellblStatus=newJLabel("Selected Tab: ");JPanelpanelControls=newJPanel();publicMyTabbedPane(){setSize(400,400);setDefaultCloseOperation(DISPOSE_ON_CLOSE);getContentPane().add(tabbedPane,BorderLayout.CENTER);JPanelpanelButtonsStatus=newJPanel();panelButtonsStatus.setLayout(newBorderLayout());JPanelpanelButtons=newJPanel();panelButtons.setLayout(newGridLayout(2,4));ButtonGroupgroup=newButtonGroup();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=newButtonGroup();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);ActionEventevt=newActionEvent(btnAdd,0,"");for(inti=0;i<10;i++){actionPerformed(evt);}tabbedPane.addChangeListener(newChangeListener(){@OverridepublicvoidstateChanged(ChangeEventevt){setStatus();}});setStatus();}privatevoidsetStatus(){if(contTabs>0){//Limpa o componente das abas pois o componente pode ser utilizado apenas uma vezfor(inti=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 + 1panelControls.removeAll();intirnd=tabbedPane.getSelectedIndex()+1;panelControls.setLayout(newGridLayout(irnd,2));for(inti=0;i<irnd;i++){panelControls.add(newJLabel("Field "+i+": "));panelControls.add(newJTextField(10));}tabbedPane.setComponentAt(tabbedPane.getSelectedIndex(),panelControls);}else{lblStatus.setText("Selected Tab: none ");}}publicstaticvoidmain(String[]args){newMyTabbedPane().setVisible(true);}@OverridepublicvoidactionPerformed(ActionEventevt){if(evt.getSource()==btnAdd){tabbedPane.addTab(("Tab "+(contTabs)),null);//tabbedPane.addTab( ("Tab " + (contTabs)), new JPanel());contTabs++;}elseif(evt.getSource()==btnRemove&&contTabs>0){tabbedPane.remove(--contTabs);setStatus();}elseif(evt.getSource()==radioTop){tabbedPane.setTabPlacement(SwingConstants.TOP);}elseif(evt.getSource()==radioLeft){tabbedPane.setTabPlacement(SwingConstants.LEFT);}elseif(evt.getSource()==radioRight){tabbedPane.setTabPlacement(SwingConstants.RIGHT);}elseif(evt.getSource()==radioBottom){tabbedPane.setTabPlacement(SwingConstants.BOTTOM);}elseif(evt.getSource()==radioScroll){tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);}elseif(evt.getSource()==radioWrap){tabbedPane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);}}}
I
irvingellan
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?