Pegando valor exato em um ArrayList?

21 respostas
fernandopaiva

Senhores (a)…

Eu tenho o seguinte ambiente.

Um container JPanel1 que possui varios outros JPanels…tipo, JPanel1…2…3…4…5…10…20.

Eu criei um jPopUpMenu com o ItemMenu para verificar esses jPanel, ai no evento MouseRelease do JPopUp eu quero pegar o nome exato do JPanel que foi clicado.
Por exemplo, se alguem clicar no jPanel30 eu vou saber.
Pra isso estou tentando usar a seguinte logica.

private void InformaçõesActionPerformed(java.awt.event.ActionEvent evt) {
        ArrayList panels = new ArrayList();        
        String nomePanels;
        for (int x = 0; x < jPanel1.getComponents().length;x++){
            panels.add(jPanel1.getComponent(x).getName());
            if (jPanel1.getComponent(x).getName().equals(panels.get(x))){
                nomePanels = (String) panels.get(x);
                System.out.println(nomePanels);
            }
        }
    }

Ainda não consigo pegar o nome do jPanel que foi clicado, se puderem me ajudar a encontrar uma solução eu agradeço…

obrigado.

21 Respostas

ViniGodoy

private void InformaçõesActionPerformed(java.awt.event.ActionEvent evt) { if (evt.getSource() instanceof JPanel) { JPanel pnlClicado = (JPanel)evt.getSource(); System.out.println(pnlClicado.getName()); } }

fernandopaiva

Opa Vini…obrigado pela atenção.

Testei seu exemplo aqui e ainda não tive resultados… porem, gostei bastante pq é bem curto o seu codigo…kkkk !!!

Ainda estou testando para ver se consigo ter resultados, qquer dica por favor, poste ae.

obrigado mais uma vez.

P.S: Vcs sabem de um bom canal java no irc em pt-br, o guj tem algum ??? Eu estou no #java-br…Nesse momento que estou aprendendo java, toda ajuda é bem vinda. Obrigado.

ViniGodoy

Você colocou um nome nos paineis com o setName?

fernandopaiva

Sim sim, todos os panels tem o nome começando por panel1 e vai até o 50…E quando tento pegar esses valores com jPanel1.getComponent(0).getName(), ele me traz o panel1 …e assim vai, conforme eu mudo o indice do metodo getComponent().getName() ele vai me trazendo o panel conforme o nome.

jPanel1.getComponent(0).getName() -> panel1
jPanel1.getComponent(1).getName() -> panel2
jPanel1.getComponent(2).getName() -> panel3

e assim vai…

obrigado.

ViniGodoy

Colocou um breakpoint ali para ver o que não funcionou? Por que uma coisa é certa, se o evento ocorreu no painel (mas não dentro de um componente dele) e foi disparado, então, com certeza, o evt.getSource() será o seu painel, com o nome dentro.

fernandopaiva

Vini,…desculpe a ignorancia. Mas não estou entendendo como fazer, o jPanel é o container dos panels1, 2, 3…etc. O jPopUpMenu eu coloquei no jPanel pq ele é o container.

novamente desculpe a ignorancia, mas realmente naum estou entendendo sua logica de como fazer.

obrigado.

ViniGodoy

Ah, desculpe, nesse caso o source é o popup menu. Foi noobice minha, pensei que o evento era de clique no JPanel.

Então o que muda é:

private void InformaçõesActionPerformed(java.awt.event.ActionEvent evt) { if (evt.getSource() instanceof JPopup) { JPopup popup = (JPopup)evt.getSource(); if (popup.getInvoker() instanceof JPanel) { JPanel pnlClicado = (JPanel)popup.getInvoker(); System.out.println(pnlClicado.getName()); } } }

fernandopaiva

ups Vini…noobice minha tbm…Eu to tentando usar um JMenuItem do jPopUpMenu…:blush:

ViniGodoy

O que vem no evt.getSource()?

Imprime na tela:

Só pra gente ver exatamente que objeto chega.

ViniGodoy

Bom, tem outra forma também. Você pode adicionar o JPanel como propriedade do mouseListener:

public class JPanelActionListener implements ActionListener {
   private JPanel panel;
   public JPanelMouseListener(JPanel jpanel) {
      this.panel = panel;
   }

   public void actionPerformed(ActionEvent evt) {
      //Agora é só usar panel aqui.
   }
}

Na hora de criar esse listener e associar para o menu, você faz:

JMenuItem mniXyz1 = new JMenuItem();
mniXyz1.addActionListener(new JPanelActionListener(painel1));


JMenuItem mniXyz2 = new JMenuItem();
mniXyz2.addActionListener(new JPanelActionListener(painel2));

Como cada menu terá seu próprio listener já com o painel certo associado, fica fácil tratar.

fernandopaiva

javax.swing.JMenuItem…como te falei, o bicho e um JMenuItem…rs !

ViniGodoy

Então siga a dica que te dei acima e associe cada painel a ao seu respectivo ActionListener. :slight_smile:

ViniGodoy

Provavelmente dá para pegar o getParent() desse JMenuItem, que deve ser um JMenu.
Ainda assim, está ficando horrivelmente trabalhoso. Acho melhor só associar o JPanel ao ActionListener mesmo.

fernandopaiva

Vini, bom…Deixa eu ver se entendi.

Da maneira que vc flw para associar todos ao actionlistener respectivo, mesmo assim eu terei que saber o nome dos panels que estou enviando naum é ???

Tbm to achando bem trabalhoso esse negocio de pegar o nome de cada panel que o JPopUpMenu->JMenuItem clica…rapaz, ta tenso…!

kkkk !! Mas vou seguindo na luta, qdo conseguir se conseguir…posto aqui como fiz. Ahhh! Lembrando q eu to usando NetBeans6 para produção e q sou noobie no java…kkk

obrigado novamente, vc é 10.

ViniGodoy

Mas aí é só pegar pelo panel.getName().

Posta aí o código de onde vc cria os menus.

fernandopaiva

Opa Vini,

Eu to usando NetBeans, entaum eu arrastei um componente JPopUpMenu para um JPanel(jPanel1) que recebe os outros JPanel(panel1,2…3…4…etc…), ai nesse JPopUpMenu eu cliquei com o direito e adicionei um JMenuItem com o texto (informações) nome variavel (informacao). Bem, essa e a maneira que fiz aqui ate agora usando a ferramenta.

Esses panels que saum criados dentro de jPanel1, cada um tem um nome iniciado com panel1 e vai ate panel50, o q eu quero e pegar o numero exato do panel clicado no jpopupmenu->jmenuitem(informacao).

Eu vi q vc usou instanceof, ai sai lendo aqui para que serve, e pelo que entendi ele serve para dizer a um componente que ele é de outro componente, é isso ??? se naum for me corrija.

Entaum usando esse raciocinio, eu tenho que criar um jmenuitem para cada panel ??? E acho q é o q vc ta tentando me dizer.

Por isso, to na pesquisa aqui pra entender melhor como isso funciona, pois como eu falei, to vindo de outra linguagem…No momento estou lendo seus exemplos e tentando entende-los para ver se consigo chegar a um ponto chave para fazer td aqui.

Obrigado Vini, vc é o cara.

ViniGodoy

Sim, eu pensei que vc estava criando os vários paineis dinamicamente, num for.

Não entendo quase nada de Netbeans. Não sei qual é a melhor maneira de fazer o que sugeri pela IDE.

fernandopaiva

Vini, quando eu faço.

jPanel1.getComponent(0).getName(); // retorna panel1
jPanel1.getComponent(1).getName(); // retorna panel2

E por ai vai…Ou seja, quando eu mudo o indicie consigo pegar o nome do panel, o problema e fazer isso automatico…obrigado !

fernandopaiva

ae Vini, eu acho q o que estou tentando fazer num vai ter jeito naum…ja to quase desistindo e tentando encontrar uma outra maneira…Vou dar mais uma pesquisada pra ver se encontro uma solucao, se encontrar posto aqui.

obrigado.

ViniGodoy

Ponha esse código no seu actionListener do MenuItem:

private void InformaçõesActionPerformed(java.awt.event.ActionEvent evt) { 
    JMenuItem mi = (JMenuItem)e.getSource();
    JPopupMenu popup = (JPopupMenu)mi.getParent();
    JPanel pnl = (JPanel)popup.getInvoker();

    System.out.println(pnl.getName());
}

Já testei aqui e funciona.

fernandopaiva

Resolvido em: http://guj.com.br/posts/list/222227.java

Criado 21 de outubro de 2010
Ultima resposta 23 de out. de 2010
Respostas 21
Participantes 2