Ajuda com ComboBox JavaFx

9 respostas
javaprogramação
S

Boa Noite. Estou com problemas ao tentar popular combobox javafx. Só aparece a referencia do objeto. Tenho 3 combobox e não sei como utilizar o toString nesse caso.
CategoriaModelo.java (533,Bytes)
GrupoModelo.java (348,Bytes)
MarcaModelo.java (344,Bytes)
ProdutoModelo.java (1,6,KB)
ProdutoDao.java (3,1,KB)
PaginaPrincipalControle.java (2,8,KB)

9 Respostas

S

Você está utilizando ObservableList<ProdutoModelo>, então os comboboxes irão apresentar o valor do toString() da classe ProdutoModelo.

Modifique seus métodos para retornar um ObservableList<String> para apresentar somente a propriedade que é de seu interesse.

Exemplo:

private ObservableList<String> carregarComboBoxCategoria() {
	ObservableList<String> categorias = null;
	try {
		ProdutoDao produtoDao = new ProdutoDao();
		ObservableList<ProdutoModelo> produtos = FXCollections.observableArrayList(produtoDao.listarCategoria());
		
		categorias = FXCollections.observableArrayList(produto -> new Observable[] { produto.getCategoria() });
		Bindings.bindContent(categorias, produtos);
	} catch (SQLException ex) {
		ex.printStackTrace();
	}
	return categorias;
}
S

Bom dia.
Deixa eu detalhar um pouco mais o meu problema.
Quando na Classe ProdutoModelo eu sobrescrevo o metodo toString para retornar a categoria por exemplo, ai no comboboxCategoria fica tudo certo. Mas ai não consigo fazer os outros combobox devido ter colocado somente a categoria como retorno.
Pergunto, usando o metodo toString retornando as 3 informações, tem como filtrar a informação que desejo.
Dessa maneira que vc colocou eu não consegui fazer rodar. Por ter alguma informação trocada ou por eu não ter o entendimento.
Estou aprendendo a programar na marra.

S

Você não deve depender do ‘toString’ para apresentar conteúdo, adapte seu código conforme o exemplo que eu postei.

S

Posta o código que você fez.

S

Vc poderia me explicar sobre essas duas linhas.

categorias = FXCollections.observableArrayList(produto → new Observable[] { produto.getCategoria() });
Bindings.bindContent(categorias, produtos);

S

A primeira linha cria uma lista observável chamada “categorias” usando o método estático FXCollections.observableArrayList(). Ela usa uma expressão lambda para mapear cada produto para sua categoria correspondente, acessando a categoria do produto usando o método getCategoria(). Isso cria uma lista dinâmica que será atualizada automaticamente sempre que houver mudanças na lista de produtos.

Na segunda linha, Bindings.bindContent(categorias, produtos) vincula dinamicamente o conteúdo da lista “categorias” à lista de produtos. Isso significa que a lista “categorias” será atualizada automaticamente sempre que houver alterações na lista “produtos”, garantindo que ambas permaneçam sincronizadas.

S

boa noite.
da erro nesse produto.getCategoria.
se eu altero para produtoModelo.getCategoria da erro de tipo de incompatibilidade (String/observable).

categorias = FXCollections.observableArrayList(produto → new Observable[] { produto.getCategoria() });
Bindings.bindContent(categorias, produtos);

S

Sempre que postar uma dúvida, posta o fonte completo da sua classe, só a parte que está dando erro nem sempre é suficiente pra gente saber o que você está fazendo.
E não esqueça de formatar direitinho aqui no fórum usando o botão “</>”.

Tenta implementar o método assim:

private ObservableList<String> carregarComboBoxCategoria() {
    ObservableList<String> categorias = FXCollections.observableArrayList();
    try {
        ProdutoDao produtoDao = new ProdutoDao();
        ObservableList<ProdutoModelo> produtos = FXCollections.observableArrayList(produtoDao.listarCategoria());

        // Usando Bindings para transformar a lista de ProdutoModelo em uma lista de Strings de categorias
        Bindings.bindContent(categorias, Bindings.createObjectBinding(() -> {
            return produtos.stream()
                           .map(ProdutoModelo::getCategoria)
                           .distinct()
                           .collect(Collectors.toCollection(FXCollections::observableArrayList));
        }, produtos));
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    return categorias;
}
S

bom dia Staroski. Consegui resolver. Utilizei o StringConverter. Funcionou perfeitamente.

Muito obrigado a vc pela atenção ai.

private ObservableList carregarComboBoxCategoria() {

try {

        produtoDao = new ProdutoDao();

        observableListaDeComboBoxCategoria = FXCollections.observableArrayList(produtoDao.listarCategoria());

        StringConverter<ProdutoModelo> converte = new StringConverter<ProdutoModelo>() {

            @Override
            public String toString(ProdutoModelo object) {

                return object.getCategoria();

            }

            @Override
            public ProdutoModelo fromString(String string) {

                return null;

            }

        };

        cbxCategoria.setConverter(converte);

    } catch (SQLException ex) {

        //Logger.getLogger(ProdutoControle.class.getName()).log(Level.SEVERE, null, ex);
    }

    return observableListaDeComboBoxCategoria;

}
Criado 14 de maio de 2024
Ultima resposta 5 de jun. de 2024
Respostas 9
Participantes 2