Boa noite,
Estou passando por uma situação que é a seguinte:
Tenho um combobox que possui 3 itens, para cada item selecionado deverão gerar uma ação que é popular o outro combobox com as informações. Meu grande problema é que preciso saber o que preciso fazer para ele na medida que seleciono um dos 3 itens ele vai alterando o outro?
Resumindo, a medida que seleciona um item no combo X buscar as informações e popular o combo Y, exemplo bom para isso é eu ter um combo de Marca de carro e outro de modelo, a medida que seleciono uma marca popula os modelos daquela marca.
Evento do ComboBox no JavaFX
10 Respostas
Basta implementar uma classe anônima (ou lambda, no Java 8) no setOnAction do combo:
package listas;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class Combo extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
ObservableList<String> opcoesUm = FXCollections.observableArrayList(
"A", "B", "C");
final ComboBox comboUm = new ComboBox(opcoesUm);
final ComboBox comboDois = new ComboBox();
// Aqui acontece o tratamento do evento de mudança :)
comboUm.setOnAction(new EventHandler<Event>() {
public void handle(Event arg0) {
ArrayList<String> lista2 = new ArrayList<String>();
// Popula os dados
for (int i = 0; i < 3; i++) {
lista2.add(String.format("%s : opcao %d",
(String) comboUm.getSelectionModel().getSelectedItem(), i));
}
// Define os valores do segundo combo
ObservableList<String> options2 = FXCollections.observableArrayList(lista2);
comboDois.setItems(options2);
}
});
primaryStage.setTitle("Listas");
HBox root = new HBox();
root.setPadding(new Insets(15, 12, 15, 12));
root.setSpacing(10);
root.getChildren().add(comboUm);
root.getChildren().add(comboDois);
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
}
Abcs!
Muito Obrigado.
Funcionou!!!
Amigo,
estou com um problema ainda:
@FXML
private void populaComboBoxVersao(ActionEvent event) {
cbCliente.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Modelo dir = new Modelo("");
if(cbCliente.getValue().toString() == "SIG"){
List<String> diretorios = dir.listaDiretorios(diretorioDasVersoesSIGCliente);
for (int i = 0; i < diretorios.size(); i++) {
cbVersao.setItems(FXCollections.observableArrayList(diretorios));
}
}else if(cbCliente.getValue() == "SG5"){
List<String> diretorios = dir.listaDiretorios(diretorioDasVersoesSG5Cliente);
for (int i = 0; i < diretorios.size(); i++) {
cbVersao.setItems(FXCollections.observableArrayList(diretorios));
}
}else if(cbCliente.getValue() == "PG5"){
List<String> diretorios = dir.listaDiretorios(diretorioDasVersoesPG5Cliente);
for (int i = 0; i < diretorios.size(); i++) {
cbVersao.setItems(FXCollections.observableArrayList(diretorios));
}
}
}
});
}
Se eu seleciono um opção no cbCliente, ele popula todas as versões no combo de versão porém se eu não seleciono uma versão e clico novamente no combo da versão para escolher o combo de versão aparece vazio.
Este é o outro combo:
@FXML
private void populaComboBoxCliente(ActionEvent event) {
ObservableList options =
FXCollections.observableArrayList(
“SIG”,
“PG5”,
“SG5” );
cbCliente.setItems(options);
}
Tente mudar:
cbCliente.getValue().toString()
para:
(String) cbCliente.getSelectionModel().getSelectedItem()
Ao comparar Strings, use equals()
((String) cbCliente.getSelectionModel().getSelectedItem()).equals("SIG")
ou
"SIG".equals((String) cbCliente.getSelectionModel().getSelectedItem());
Abcs!
ProblemaComboboxJavaFX.rar (46.9 KB)
Este é o meu problema!!!
Tem algum tratamento de eventos no segundo combo?
Não, deve ser isso!! Qual seria a solução nesse caso??
Algum tratamento de eventos na tela está limpando o combo na mudança de opção. Dá uma olhada se o cbVersao.setItems está sendo chamado em algum outro ponto da tela. Se puder, tenta debugar a chamada a esse método do seu objeto, pra ver se em algum momento a lista passada é vazia ou null.
Abcs!
Verifiquei aqui, e a principio não esta sendo chamado em nenhum ponto não!!!
;/////