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)
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;
}
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.
Você não deve depender do ‘toString’ para apresentar conteúdo, adapte seu código conforme o exemplo que eu postei.
Posta o código que você fez.
Vc poderia me explicar sobre essas duas linhas.
categorias = FXCollections.observableArrayList(produto → new Observable[] { produto.getCategoria() });
Bindings.bindContent(categorias, produtos);
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.
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);
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;
}
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;
}