Evento do ComboBox no JavaFX

10 respostas
S

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.

10 Respostas

H

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!

S

Muito Obrigado.

Funcionou!!!

S

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.

S

Este é o outro combo:

@FXML

private void populaComboBoxCliente(ActionEvent event) {

ObservableList options =

FXCollections.observableArrayList(

SIG,

PG5,

SG5			    );

cbCliente.setItems(options);

}
H

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!

S

ProblemaComboboxJavaFX.rar (46.9 KB)

Este é o meu problema!!!

H

:open_mouth: Tem algum tratamento de eventos no segundo combo?

S

Não, deve ser isso!! Qual seria a solução nesse caso??

H

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!

S

Verifiquei aqui, e a principio não esta sendo chamado em nenhum ponto não!!!

;/////

Criado 14 de março de 2016
Ultima resposta 16 de mar. de 2016
Respostas 10
Participantes 2