JComboBox + Classe Enum + Strings

Galera, td bom?
To querendo preencher meu jComboBox da seguinte maneira, tenho uma clsse enum:

[code]public enum EstadoCivilEnum {
SOLTEIRO(“Solteiro(a)”),
CASADO(“Casado(a)”),
VIUVO(“Viúvo(a)”),
DIVORCIADO(“Divorciado(a)”);

private String estadoCivil;

private EstadoCivilEnum(String estadoCivil){
    this.estadoCivil = estadoCivil;
}
    
public String getEstadoCivil(){
    return this.estadoCivil;
}

}[/code]

E carrego ela no meu jComboBox dessa maneira:

jCBEstadoCivil.setModel(new javax.swing.DefaultComboBoxModel(this.clienteController.getCliente().getEstadoCivil().values()));

Funciona perfeitamente, porém os valores listados nele são:

SOLTEIRO
CASADO,
VIUVO
DIVORCIADO

E gostaria que ficasse assim:

Solteiro(a)
Casado(a)
Viúvo(a)
Divorciado(a)

Tem como? Já tentei fazer um método que retorna um um array mais ou menos assim:

public String[] getValuesString(){ String [] values = {SOLTEIRO.getEstadoCivil(), CASADO.getEstadoCivil(), VIUVO.getEstadoCivil(), DIVORCIADO.getEstadoCivil()}; return values; }

Mas como no jComboBox não passa nenhum parametro para o construtor da minha classe Enum, esse método acaba dando nullPointer.

Obrigado. :slight_smile:

Então, eu pessoalmente nunca usei usei um enum para preencher um jComboBox mas sempre usei uma array de String; ao invés de você definir um enum defina no lugar um array de string contendo String[] EstadoCivilEnum = {"Solteiro(a)", "Casado(a)","Viúvo(a)","Divorciado(a)"}; isso deve funcionar corretamente, mas com relação ao enum n posso falar muito numca usei muito ele :(, o problema deve ta ocorrendo quando você usa o metodo “values()” do enum ele não deve retornar o correto talvez por cause do funcionamento de um enum

Obrigado pela resposta, porém gostaria de aprender com enum, para poder deixar as coisas bem separadas.

Se tiver mais alguma idéia para ajudar, vlw

Pode ser assim:

public String[] getEstadosCivis() {
	String[] estados = new String[EstadoCivilEnum.values().length];
	for (EstadoCivilEnum estadoEnum : EstadoCivilEnum.values()) {
		estados[estadoEnum.ordinal()] = estadoEnum.getEstadoCivil();
	}
	return estados ;
}

[quote=Rodrigo Oliveira]Pode ser assim:

public String[] getEstadosCivis() {
	String[] estados = new String[EstadoCivilEnum.values().length];
	for (EstadoCivilEnum estadoEnum : EstadoCivilEnum.values()) {
		estados[estadoEnum.ordinal()] = estadoEnum.getEstadoCivil();
	}
	return estados ;
}

[/quote]

Obrigado pela ajuda, mas o problema ainda continua, pois ao rodar isso da nullPointer.
O que eu deveria fazer para esse código não gere o nullPointer? Obrigado.

jCBEstadoCivil.setModel(new javax.swing.DefaultComboBoxModel(this.clienteController.getCliente().getEstadoCivil().getEstadosCivis()));

Esse objeto clienteController seu parece ser o problema… se achar necessario posta esse controller pra gente ver…

Fiz uma forma diferente da sua pra carregar o combo, ele precisa estar no construtor da sua classe;


private void carregaComboEstadoCivil(){
    DefaultComboBoxModel comboModel = (DefaultComboBoxModel) comboEstadoCivil.getModel();
    comboEstadoCivil.removeAllItems();
    for (String estado :  getEstadosCivis()) {
        comboEstadoCivil.addItem(estado);
    }
}

[quote=Rodrigo Oliveira][quote]
this.clienteController.getCliente().getEstadoCivil().getEstadosCivis())
[/quote]
Esse objeto clienteController seu parece ser o problema… se achar necessario posta esse controller pra gente ver…

Fiz uma forma diferente da sua pra carregar o combo, ele precisa estar no construtor da sua classe;


private void carregaComboEstadoCivil(){
    DefaultComboBoxModel comboModel = (DefaultComboBoxModel) comboEstadoCivil.getModel();
    comboEstadoCivil.removeAllItems();
    for (String estado :  getEstadosCivis()) {
        comboEstadoCivil.addItem(estado);
    }
}

[/quote]

Obrigado pela ajuda novamente, porém sem sucesso, volta a dar NullPointer no caso agora deu no:

for (String estado :  clienteController.getCliente().getEstadoCivil().getEstadosCivis()) {  

Qto a minha classe ClienteController a unica coisa que fiz nela em questão é criar o objeto Cliente(para não deixar na tela view) que dentro dele tenho um atributo estadoCivil que no caso é a classe Enum.

Por isso o motivo do .clienteController.getCliente().getEstadoCivil().getEstadosCivis()

Foi fazer um teste usando diretamente a classe enum no jComboBox, já te falo o resultado, obrigado.

Rodrigo Oliveira

Sua dica me ajudou, coloquei diretamente no jComboBox o seguinte:

jCBEstadoCivil.setModel(new javax.swing.DefaultComboBoxModel(EstadoCivilEnum.getEstadosCivis()));

Ou seja, ao inves de ir pelo objeto, q obviamente era ele que estava null e não a classe Enum (que isso q me confundiu) peguei o valor direto da classe Enum.

No caso nem precisou do código:

private void carregaComboEstadoCivil(){ DefaultComboBoxModel comboModel = (DefaultComboBoxModel) jCBEstadoCivil.getModel(); jCBEstadoCivil.removeAllItems(); for (String estado : EstadoCivilEnum.getEstadosCivis()) { jCBEstadoCivil.addItem(estado); } }

Muito obrigado pela ajuda. []s

Depois de arrumar todos os meus jComboBox agora me aparece outro problema :shock:

No caso como disse antes tenho um objeto Cliente que tem um atributo EstadoCivil que é uma classe Enum, na hora que vou persistir no banco da esse erro:

java.lang.ClassCastException: java.lang.String cannot be cast to model.cliente.EstadoCivilEnum

Ou seja, como meus jComboBox estão sendo “populados” com as strings do Enum, então na hora de persistir ele não converte string para o valor do enum.

this.clienteController.getCliente().setEstadoCivil((EstadoCivilEnum)jCBEstadoCivil.getSelectedItem());

O que posso fazer?

Obrigado.

Resolvi o problema porém desse jeito fica muito custoso, se alguém poder me ajudar a pensar em algo mais prático, pois no caso se o ENUM tiver muitas constantes ai complica.

public static EstadoCivilEnum getEnum(String string){ if (string == "Solteiro(a)"){ return SOLTEIRO; }else if (string == "Casado(a)"){ return CASADO; }else if (string == "Divorciado(a)"){ return DIVORCIADO; } return null; }

Obrigado.

É só lembrar que cada item de um enum é um objeto. E o que define como um objeto impresso é o seu método toString().

Portanto, mude seu enum para:

[code]public enum EstadoCivilEnum {
SOLTEIRO(“Solteiro(a)”),
CASADO(“Casado(a)”),
VIUVO(“Viúvo(a)”),
DIVORCIADO(“Divorciado(a)”);

private String estadoCivil;

private EstadoCivilEnum(String estadoCivil){
    this.estadoCivil = estadoCivil;
}

public String getEstadoCivil(){
    return this.estadoCivil;
}    

@Override      
public String toString(){
    return this.estadoCivil;
}    

}[/code]

Assim o toString() fica sobrecarregado e o resto, poderia deixar igual ao que estava antes.

E PS, você está certo. É bem melhor usar objetos de negócio dentro do JCombobox (em enums ou não) do que usar Strings.
Isso evita ter que criar arrays hororrosos para mapeamento, como o que o Rodrigo Oliveira estava sugerindo.