[RESOLVIDO]Pegar nome do item selecionado de JButtonGrupo

Ola galera,

eu criei itens para para uma menu através de um vetor de string:

public void ListarIps(){

        Conect.removeAll();
        Conect.add(ConectTo);
        jSeparator1.setEnabled(true);
        Conect.add(jSeparator1);
        GrupoVazio = null;
          if(IpsConectados != null)

            for(int x=0;x<qntIpsConectados;x++){
                JCheckBoxMenuItem novo;
                if(x==qntIpsConectados-1){
                    panelTerminal1.IpSelected = IpsConectados.get(x);
                    novo = new JCheckBoxMenuItem(IpsConectados.get(x).toString(), true);
                }
                else{
                    novo = new JCheckBoxMenuItem(IpsConectados.get(x).toString(), false);
                }
                System.out.println(panelTerminal1.IpSelected);
                Conect.add(novo);
                GrupoIps.add(Conect.getItem(x+2));
               
            }
       
    }

mas agora eu to com um problema para pegar o nome do item que ta selecionado.

public void setIpSelected(){

    if(!GrupoIps.equals(GrupoVazio)){
         if(!GrupoIps.getSelection().isSelected()){
             panelTerminal1.IpSelected = null;
         }
         else{
             //problem is here
            
             panelTerminal1.IpSelected = GrupoIps.getSelection().getActionCommand();
            System.out.println(panelTerminal1.IpSelected);
         }
    }
    else
        panelTerminal1.IpSelected = null;

}

o comando me retorna null, ou então se uso:

panelTerminal1.IpSelected = GrupoIps.getSelection().toString();

ele me retorna uma string totalmente loca,

Aguem pode me ajudar, a pegar o nome correto no item selecionado?

Obrigado.

me parece que ta vindo um numero totalmente confuso pq vc ta pegando o checkbox do grupoIps e não o item selecionado… vc teria que pegar o checkbox dentro do grupo Ips e aí sim usar o getSelectedObjects no checkbox que vc pegou la entende…?

mas nao tenho certeza pq tenho algumas duvidas dae ainda e to “chutando” o que são algumas coisas… o que é o GrupoIPs? ou o panelTerminal? e o Conect? e o ConectTo? e os IpsConectados? e qual o printstackTrace do erro?

Bom, primeiro vo explicar melhor então,

GrupoIps é o grupo de JMenuItemCheckBox, que contem os endereços de Ips conectados.
O panelTerminal é o JPanel que precisa receber a String do Ip selecionado.
O Conect é o Menu da Barra de Menus que guarda a lista de Ips conectados para o usuário selecionar.
e o ConectTo é um botão desse menu que adiciona mais Ips.

Por fim entendi o que tenho que fazer, até tentei fazer isso pegando o item selecionado e jogando para uma Variável do mesmo tipo e pegando o nome dela, mas também não funcionou.

Não tenho o código aqui agora pra te explicar o erro certo, mas aquele comanda ta me retornando uma string “java.swi…” alguma coisa assim, não me recordo direito, e ai erro acontece quando tento me conectar a esse suposto Ip que na verdade é uma string errada.

Saberia como poderia fazer para pegar o checjbox de dentro do grupo?

Obrigado.

os IpsConectados eh um map? e esse GrupoIps eh uma classe sua? pq normalmente vc adiciona o item diretamente no menu… o que faz o método add da sua classe GrupoIps?adiciona onde?

essa parte aqui:

GrupoIps.add(Conect.getItem(x+2));

vc ta adicionando o menuItem em algum canto da classe grupo ( percebe? nao ta adicionando o menu e sim o item… e esse x+2? ele pode estar null… ta tratando isso? )

vc poderia colocar algo assim após o usuário selecionar os ips

[code]JCheckBoxItem temp;
ArrayList arrayDeIPs;

for ( int i = 0; i < menu.getComponentCount(); i++ ) {

if ( menu.getComponent(i) instanceof JCheckBoxItem ) {

  temp = (JCheckBoxItem) menu.getComponent(i);

  if ( !temp.isSelected() ) {
     continue;
  }

  arrayDeIPS.add( temp.getText() );

}
}
[/code]
dae vc percorre o array pra fazer o que quiser com os selecionados

ps: escrevi direto aqui o código… corrige ou adapta se for usar =p

Não, IpsConectados é uma ArrayList de String e o grupoIps é um ButtonGroup, coloquei errado acima, desculpe.

Creio que ele não va chegar a null, pois se ele chegar fora do limite ele vai disparar uma exceção.

Entendi o que você esta fazendo, vou tentar implementar essa solução e te retorno se deu certo.

Obrigado.

Infelismente não funcionou.

Acho que tem alguma coisa errada com o meu Menu, o Conect, pois ta dando este erro:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 0
        at java.awt.Container.getComponent(Container.java:294)
        at Pacote.Janelas.TelaInicial.setIpSelected(TelaInicial.java:25)

quando ele tenta fazer o:

if ( Conect.getComponent(i) instanceof JCheckBoxMenuItem ) 

e quando eu do um:

Conect.getComponentCount()

ele me retorna zero.

sera que o problema pode ser na hora add os componetes?

Alguem sabe o que pode tara contesendo?

Se meu metodo de add itens no menu ta correto?

Abraços.

Bom… vou falar bom base no que estou vendo… posso estar errado por causa dos trechos de código q não estão à amostra :slight_smile:

veja bem… ali onde vc diz que será um valor null e cairá na exceção, vc fez:

[quote]Conect.add(novo);
GrupoIps.add(Conect.getItem(x+2));[/quote]

note que ali vc ta guardando um valor Null e não o item que vc acabou de criar… la em cima vc da um removeAll no conect entao ele está vazio… desse modo x+2 = null… qndo vc der um getComponentCount vai ter 0 mesmo… e, olha soh, não caiu numa exceção :wink:

alias eh isso q vc queria mesmo? guardar os itens do menu no GroupButton? Pra que vc iria querer isso se vc pode resgatar os valores direto do menu? se queria apenas guardar os valores selecionados não seria o ideal usar um arrayList ao invés do GroupButton?

minha sugestão é de que vc esqueça de uma vez o groupButton… adicione o JCheckBoxMenuItem direto no menu e usa o jeito q te falei pra pegar os componentes do menu e ja ir verificando o que está selecionado…

usa-se mais o GroupButton quando vc precisar, por exemplo, que 1 só valor seja selecionado… é seu caso? se for seu caso use radioButton ao invés de JCheckBoxMenuItem…

se ainda assim der erro, coloca os metodos inteiros de novo do listarIP e setIPselected pra ver como está agora… e a pilha do erro claro

Sim, é o meu caso, eu preciso que só um seja selecionado, e ainda pior, eu preciso que isso seja infinito, ou seja, eu preciso que quando for conectando um novo IP seja adicionado ele a essa lista e a esse menu.

o GrupoIps.add(Conect.getItem(x+2)); é porque tenho dois itens antes do grupo de ips, o botão ConectTo e um separador e essa parte parece estar funcionando porque eles ficam adicionado ao grupo, e quando seleciono um descelecionado outro.

Amanha posto todo o código para ser analizado.
Obrigado por enquanto.

TelaInicial


public int qntIpsConectados = 0;
public List<IdentificacaoIps> ListaIpConectados = new ArrayList<IdentificacaoIps>();

public void setIpSelected(){

    JCheckBoxMenuItem temp;  
    
   
     
    for ( int i = 0; i <= JsMenuConect.getComponentCount(); i++ ) {
     
      if ( JsMenuConect.getComponent(i) instanceof JCheckBoxMenuItem ) {
     
          temp = (JCheckBoxMenuItem) JsMenuConect.getComponent(i);
      
        if ( !temp.isSelected() ) {  
            continue;  
         }

         IdentificacaoIps Auxiliar = new IdentificacaoIps();
         for(int x = 0; x<qntIpsConectados;x++){

                Auxiliar = (IdentificacaoIps) ListaIpConectados.get(x);

                if(Auxiliar.Ip.equals(temp.getText()))
                    break;
         }

         PanelPrincipal.setBorder(BorderFactory.createTitledBorder(Auxiliar.Ip + " - " + Auxiliar.Nome));
         panelTerminal1.IpSelected = temp.getText();
         System.out.println(panelTerminal1.IpSelected);
        }  
   }  
}

public void AddIp(IdentificacaoIps NameIp){
        IdentificacaoIps Auxiliar = new IdentificacaoIps();
        boolean flag = false;
        
        if(NameIp.Ip != null){
            for(int x = 0; x<qntIpsConectados;x++){

                Auxiliar = (IdentificacaoIps) ListaIpConectados.get(x);

                if(Auxiliar.Ip.equals(NameIp.Ip)){
                    flag = true;
                    break;
                }
                    
            }
            if(flag){
                JOptionPane.showConfirmDialog(null, "This Ip, " + NameIp.Ip + ", is already connected", "Conect", 2, 1);
                
             }
            else{
                
                 ListaIpConectados.add(NameIp);
                 qntIpsConectados++;
                 ListarIps();
                 JOptionPane.showConfirmDialog(null, "You are connected to " + NameIp.Ip, "Conect", 2, 1);
               
            }
        
        
        }
              
    }


    public void ListarIps(){
        IdentificacaoIps Auxiliar = new IdentificacaoIps();

        JsMenuConect.removeAll();
        JsMenuConect.add(ConectTo);
        jSeparator1.setEnabled(true);
        JsMenuConect.add(jSeparator1);
        
          if(ListaIpConectados != null){

            for(int x=0;x<qntIpsConectados;x++){
                JCheckBoxMenuItem novoIp;
                Auxiliar = (IdentificacaoIps) ListaIpConectados.get(x);

                if(x==qntIpsConectados-1){

                    PanelPrincipal.setBorder(BorderFactory.createTitledBorder(Auxiliar.Ip + " - " + Auxiliar.Nome));
                    panelTerminal1.IpSelected = Auxiliar.Ip;
                    novoIp = new JCheckBoxMenuItem(Auxiliar.Ip, true);
                    
                }
                else{
                    novoIp = new JCheckBoxMenuItem(Auxiliar.Ip, false);
                }



                JsMenuConect.add(novoIp);
                GrupoIps.add(JsMenuConect.getItem(x+2));
                //fazer o ultimo ficar selecionado
            }
          }
    }

 private void JsMenuConectMenuDeselected(javax.swing.event.MenuEvent evt) {                                            
        setIpSelected();
    }                                          

Panel Terminal:

String IpSelected = null;


    public void setTerminal(String str) {

        if(SaidaTerminal.getText() == null ? "" == null : SaidaTerminal.getText().equals("")){
                     SaidaTerminal.setText(str);
                }
                else
                    SaidaTerminal.setText(SaidaTerminal.getText() + "\n" + str);
    }


public void buttonStart() throws IOException{

        TestSet adaptador = new TestSet();
        String Ip = IpSelected;
        if(Ip != null){
            System.out.println(Ip);
            adaptador.conectar(Ip);
            
                String retorno;
                String teste = EntradaTerminal.getText();
                if(teste.equals("")){
                    JOptionPane.showConfirmDialog(null, "You need to write a command", "Error", 2, 2);
                }
                else{
                    setTerminal(teste);

                EntradaTerminal.setText("");

                retorno = adaptador.enviaComando(teste);

                setTerminal(retorno);
                }
                

                adaptador.desconactar();
        }
        else{

            JOptionPane.showConfirmDialog(null, "You need to select a Test Set in the item 'Conect'", "Error", 2, 2);
            
        }
    } 

Bom, acho que aqui tem todo o código que precisa como tinha prometido.
Espero que possam me ajudar. Obrigado.