Manipulando JComboBox

12 respostas
newbcc

Olá pessoal preciso fazer o seguinte:

  • tenho seis ComboBox que possuem seis mesmos valores para todos.

O quê eu quero fazer é:

  • ter somente um ComboBox habilitado no começo do programa e conforme o usuário selecionar um valor neste, o segundo ComboBox passaria a ser habilitado e assim sucessivamente até o último ComboBox.

  • conforme eu selecionar um valor nos ComboBox’s anteriores, este valor não poderá estar habilitado para os próximos ComboBox.

Existe alguma palavra chave para eu procurar por um método que faça isso, ou necessariamente terei que fazer uma série de comparações!? Enfim, não sei como fazer. Tenho a parte dos seis ComboBox montados e com os respectivos valores, porém, não sei como começar a fazer.

Agradeço por qualquer dica, sugestão.

Abraços.

12 Respostas

Reciclante

Se eu entendi bem, vc precisa deixar todos os jcombos como enable false, menos o primeiro. Quando é selecionado o ítem no primeiro, vc dá enable true no próximo e adiciona os valores no próximo jcombo excluindo o selected item do primeiro combo, e o mesmo para os próximos combos. Consegue implementar isso?

Os valores dos Jcombos são fixos ou vc puxa de um BD?

newbcc

Cara, são valores fixos.

Poxa, que solução bacana. Desculpem-me pela minha limitação :slight_smile: mas valeu muito a sua dica. Como está quase na hora de saída do trabalho, amanhã já começo a implementar esta lógica. :slight_smile:

Valeu mesmo pela dica Reciclante. Abraços.

Qualquer coisa eu volto e posto as novidades/erros/lamentações :slight_smile:

Valeu!!

newbcc

Opa, bom dia!!

Eu preciso necessariamente fazer muitas comparações para poder formar o String[] com os novos valores para cada um dos combobox?

Por exemplo.

Imagine que no primeiro comobox possuo os seguintes valores: 1,2,3,4,5 e 6

Escolhendo um deles, este valor não poderá estar disponível para os demais ComboBox; sendo assim e como são 6 ComboBox’s, o último teria apenas uma única opção a ser escolhida.

Existe uma maneira mais esperta de se formar esses vetores para cada um dos ComboBox’s ou tem que fazer vários “if - else”???

Obrigado mais uma vez!

Reciclante

Tentei rapidão criar aqui o que vc está fazendo e não vi necessidade de usar IF e Else. Cada vez que vc escolhe um ítem em um combo, ele some dos demais:

//Crie os 6 combobox no seu form e deixe-os sem conteúdo algum. Na inicialização do form adicione os ítens aos combos, adicione tudo em todos:
        jComboBox1.addItem("UM");
        jComboBox1.addItem("DOIS");
        jComboBox1.addItem("TRES");
        jComboBox1.addItem("QUATRO");
        jComboBox1.addItem("CINCO");
        jComboBox1.addItem("SEIS");
        
        jComboBox2.addItem("UM");
        jComboBox2.addItem("DOIS");
        jComboBox2.addItem("TRES");
        jComboBox2.addItem("QUATRO");
        jComboBox2.addItem("CINCO");
        jComboBox2.addItem("SEIS");  

//Deixe todos os combos como enable false, menos o primeiro.
//Na ActionPerformed do primeiro combo coloque:

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        jComboBox2.enable(true);
        jComboBox2.removeItem(jComboBox1.getSelectedItem());
        jComboBox3.removeItem(jComboBox1.getSelectedItem());
        jComboBox4.removeItem(jComboBox1.getSelectedItem());
        jComboBox5.removeItem(jComboBox1.getSelectedItem());
        jComboBox6.removeItem(jComboBox1.getSelectedItem());
    }  
//Repita para os demais Combos
    private void jComboBox2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        jComboBox3.enable(true);
        jComboBox3.removeItem(jComboBox2.getSelectedItem());
        jComboBox4.removeItem(jComboBox2.getSelectedItem());
        jComboBox5.removeItem(jComboBox2.getSelectedItem());
        jComboBox6.removeItem(jComboBox2.getSelectedItem());
    }
Acho que com isso vc consegue fazer, eu testei aqui e funcionou, realmente removeu do próximo combo, o problema é que quando vc faz isso e quer mudar o que escolheu, não está devolvendo aos demais combos, teria que criar isso, ou inativar o combo usado depois da escolha, escolheu uma vez, já era, se errou, fecha o form e abre de novo.
Reciclante

Pensando melhor, vc pode criar um botão LIMPA e outro PRONTO nesse form, se eu errei a seleção dos ítens, clico no LIMPA e ele devolve todos os ítens aos combos, removendo antes qualquer coisa que tivesse lá com um jComboBox1.removeAllItems(). Já no borão PRONTO, vc pega o valor do selectedItem de cada um deles e usa na próxima etaque que vc tiver.

Isso tá me parecendo interface de jogo.

newbcc

Opa, beleza cara!?

Então segui o quê você havia sugerido e deu certo mesmo.

Estou usando as seguintes lógicas:

  • início somente o primeiro ComboBox com setEnabled ( true )
  • conforme eu “escuto” através dos meus Listeners eu habilito os seguintes, retirando com um: removeItem( .getSelectedItem ) o item anterior escolhido pelo usuário
  • se o usuário quiser modificar os valores anteriores ele tem que necessariamente preencher os demais campos para que quando o botão de limpeza seja acionado faça as devidas limpezas
  • e ao final tenho botão para identificar os valores escolhidos.

Valeu por essas dicas. E já aproveitando, você saberia me dizer como eu poderia popular o meu ComboBox com cores?

Por exemplo, em vez de aparecer um valor “1”, aparece uma listra de cor vermelha. A idéia seria poder selecionar cores, e não valores alfa-numéricos.

Bom as dicas foram demais!!! Valeu mesmo, abraços.

Reciclante

Cor eu não sei não. Mas acho que vc terá que fazer a lista das cores com os nomes delas e internamente no programa ligar esse nome a um código de cor.
Vou ficar devendo essa.

newbcc

Bom, vou ver aqui então como posso fazer.

Assim que finalizar posto a resposta. :slight_smile:

Obrigado velho… valeu mesmo!

Abraços

brlima

Ahmm… usa custom renderers

brlima

Só pra ver se eu lembrava… rs

package tmp;

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionListener;

import javax.swing.ComboBoxEditor;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.event.EventListenerList;

public class JComboBoxColor extends JComboBox {

    /**
     * Renderer
     */
    private class ColorCellRenderer extends DefaultListCellRenderer {
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
                boolean cellHasFocus) {

            Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

            if (value instanceof Color) {
                c.setBackground((Color) value);
                c.setForeground((Color) value);
            }

            return c;
        }
    }

    /**
     * Editor
     */
    private class ColorCellEditor implements ComboBoxEditor {
        private JLabel component = new JLabel();
        private Object value = null;
        transient protected EventListenerList listenerList = new EventListenerList();

        public Component getEditorComponent() {
            if (getItem() instanceof Color) {
                component.setBackground((Color) getItem());
                component.setForeground((Color) getItem());
            }
            component.setText("");
            component.setOpaque(true);
            return component;
        }

        public Object getItem() {
            return this.value;
        }

        public void setItem(Object value) {
            if (value instanceof Color) {
                component.setBackground((Color) value);
                component.setForeground((Color) value);
            }
            this.value = value;
        }

        public void addActionListener(ActionListener l) {
            listenerList.add(ActionListener.class, l);
        }

        public void removeActionListener(ActionListener l) {
            listenerList.remove(ActionListener.class, l);
        }

        public void selectAll() {
        }
    }

    /**
     * Contructor
     */
    public JComboBoxColor() {
        setRenderer(new ColorCellRenderer());
        setEditor(new ColorCellEditor());
        setEditable(true);
    }
}
jj_df
Valeu por essas dicas. E já aproveitando, você saberia me dizer como eu poderia popular o meu ComboBox com cores?

Eu dei uma pesquisada e construi o seguinte código que atende exatamente o que você pediu. Basta inserir a classe abaixo no seu projeto e em seguida adicionar itens ao seu JComboBox assim:

cbPerfil.addItem(new Color(255, 0, 0));
//Depois de setar todas as opções do JComboBox vc renderiza ele usando a classe abaixo.
cbPerfil.setRenderer(new ColorComboRenderer());
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;

import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

public class ColorComboRenderer extends JPanel implements ListCellRenderer {
  protected Color m_c = Color.black;

  public ColorComboRenderer() {
    super();
  }

  public Component getListCellRendererComponent(JList list, Object obj,
      int row, boolean sel, boolean hasFocus) {
    if (obj instanceof Color)
      m_c = (Color) obj;
    return this;
  }

    @Override
  public void paint(Graphics g) {
    setBackground(m_c);
    super.paint(g);
  }
}

Espero ter ajudado, procurei na net um tempinho e só tinha encontrado formas complicadas de fazer isso, e na verdade é bem simples.

Pra mim essa solução se encaixou perfeitamente.

Flws

newbcc

Se vocês ajudaram!?!?!? Caraleo vocês foram demais!!! :smiley: :smiley: :smiley:

Sinceramente não sei como agradecer, espero poder também ter um background assim em um futuro próximo e ajudar ao pessoal por aqui!!!

Muito obrigado à todos vocês, o seu código “jj_df” se encaixou perfeito aqui!!! Valeu mesmo à todos!!

Abraços!!!

Criado 18 de agosto de 2008
Ultima resposta 22 de ago. de 2008
Respostas 12
Participantes 4