(RESOLVIDO) JComboBox: Problemas ao capturar item e cor de fundo

4 respostas
carlinhoscomp

Fala galera blz?
é o seguinte, montei meu JComboBox da seguinte forma:

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import javax.swing.*;

public class teste extends JFrame {

    private JComboBox jcbCor;

    public teste() {
        ListCellRenderer renderer = new ComplexCellRenderer();
        Object elements[][] = {
            {"Azul", "-13421569"},// valor -13421569 é capturado com Integer.toString(componente.getBackground().getRGB());
            {"Amarelo", "-205"},
            {"Vermelho", "-65536"}};


        jcbCor = new JComboBox(elements);
        jcbCor.setRenderer(renderer);
        add(jcbCor);
        setVisible(true);
        addWindowListener(new WindowAdapter() {

            public void windowClosing(java.awt.event.WindowEvent evt) {
                System.exit(0);
            }
        });

        jcbCor.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.out.println(jcbCor.getSelectedItem().toString());
            }
        });
    }

    public static void main(String[] args) {
        teste main = new teste();
        main.setSize(200, 65);
        main.setVisible(true);
    }
}

class ComplexCellRenderer implements ListCellRenderer {

    protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();

    public Component getListCellRendererComponent(JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus) {
        String nome = null;
        String cor = null;

        JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index,
                isSelected, cellHasFocus);

        if (value instanceof Object[]) {
            Object values[] = (Object[]) value;
            nome = (String) values[0];
            cor = (String) values[1];
            renderer.setText(nome);
            renderer.setBackground(Color.decode(cor));
        } else {
            nome = "";
        }
        return renderer;
    }
}

Problema:
*Nao consigo pegar o item selecionado (jcbCor.getSelectedItem)
*Como faco para pegar a cor de fundo do item selecionado

Alguma sugestao?

4 Respostas

Alfredo_Barbosa

você precisa de um vetor com as strings (que aparecerão no comboBox) e outro de mesmo tamanho com as cores
daí no tratamento do evento você faz

setColor(vetorDeCores[comboBox.getSelectedIndex()]

porque o item do comboBox não é a cor, mas sim a string
você precisa então de outro vetor e vai usar o index selecionado do combo box

carlinhoscomp

Ok, problema resolvido.

Ficou Assim?

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import javax.swing.*;

public class teste extends JFrame {

    private JComboBox jcbCor;

    public teste() {
        ListCellRenderer renderer = new ComplexCellRenderer();

        final String[] cores = new String[]{
            "-13421569",
            "-205",
            "-65536"
        };
        /* Array de nome da cor */
        final String[] nomes = new String[]{
            "Azul",
            "Amarelo",
            "Vermelho"
        };
        Object elements[][] = {
            {"Azul", "-13421569"},// valor -13421569 é capturado com Integer.toString(componente.getBackground().getRGB());
            {"Amarelo", "-205"},
            {"Vermelho", "-65536"}};


        jcbCor = new JComboBox(elements);
        jcbCor.setRenderer(renderer);
        add(jcbCor);
        setVisible(true);
        addWindowListener(new WindowAdapter() {

            public void windowClosing(java.awt.event.WindowEvent evt) {
                System.exit(0);
            }
        });

        jcbCor.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.out.println(nomes[jcbCor.getSelectedIndex()]);
                jcbCor.setBackground(Color.decode(cores[jcbCor.getSelectedIndex()]));
            }
        });
    }

    public static void main(String[] args) {
        teste main = new teste();
        main.setSize(200, 65);
        main.setVisible(true);
    }
}

class ComplexCellRenderer implements ListCellRenderer {

    protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();

    public Component getListCellRendererComponent(JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus) {
        String nome = null;
        String cor = null;

        JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index,
                isSelected, cellHasFocus);


        if (value instanceof Object[]) {
            Object values[] = (Object[]) value;
            nome = (String) values[0];
            cor = (String) values[1];
            renderer.setText(nome);
            renderer.setBackground(Color.decode(cor));
        } else {
            nome = "";
        }
        return renderer;
    }
}
Alfredo_Barbosa

eu tava falando de um array de cores mesmo

String nomes[]={“RED”, “BLUE”, “BLACK”};
Color color[]={Color.RED, Color.BLUE, Color.BLACK};

mas se você resolveu desse jeito, cara, tá tudo certo =)

carlinhoscomp

eh pq as cores poderao ser mudado dinamicamente, as cores nao serao fixas.
no array de cores eu adicionarei variaveis com os codigo correspondente a cada cor.

mas valeu pela ideia, esta funcionando do jeito que eu queria.

Valeu

Criado 22 de fevereiro de 2011
Ultima resposta 22 de fev. de 2011
Respostas 4
Participantes 2