Pues eso.... como siempre se requieren chorradas para presentar los datos al usuario de una forma facil de digerir, y ahora se necesita un checkBox con seleccion multiple.
Pues me di de topes, porque no hayaba la forma y al final realice un componente que para sacarnos de apuros ayuda....
import java.util.ArrayList;
import java.util.List;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import javafx.stage.Popup;
/**
* Simula un ListBox con elementos checkBox.
* @author oscarha
*
*/
public class MultiComboBox<T> extends VBox implements EventHandler<Event>{
private ListView<CheckBox> checkBoxList = new ListView<CheckBox>();
private Popup checkBoxListPopup = new Popup();
private List<T> dataList = new ArrayList<T>();
private Button comboLabel = new Button("0 Seleccionados");
/**
* Constructor por defecto.
*/
public MultiComboBox(){
checkBoxListPopup.setAutoHide(true);
checkBoxListPopup.setAutoFix(true);
checkBoxListPopup.setHideOnEscape(true);
checkBoxListPopup.getContent().add(checkBoxList);
getChildren().add(comboLabel);
comboLabel.setOnMouseClicked(this);
checkBoxList.setOnMouseClicked(this);
}
/**
* OnClick
*/
public void handle(Event event) {
if(event.getSource().equals(comboLabel)){
comboLabelOnClick();
}
}
/**
* Muestra o esconde el ListView de CheckBoxes
*/
private void comboLabelOnClick(){
if(checkBoxListPopup.isShowing()){
checkBoxListPopup.hide();
}else{
Parent parent = getParent();
Bounds childBounds = getBoundsInParent();
Bounds parentBounds = parent.localToScene(parent.getBoundsInLocal());
double layoutX = childBounds.getMinX() + parentBounds.getMinX() + parent.getScene().getX() + parent.getScene().getWindow().getX();
double layoutY = childBounds.getMaxY() + parentBounds.getMinY() + parent.getScene().getY() + parent.getScene().getWindow().getY();
checkBoxListPopup.show(this, layoutX, layoutY);
}
}
/**
* Obtiene todos los datos.
* @return
*/
public List<T> getDataList() {
return dataList;
}
/**
* Inicializa los datos.
* @param pDataList
*/
public void setDataList(List<T> pDataList) {
this.dataList = new ArrayList<T>();
this.dataList.add(null);
this.dataList.addAll(pDataList);
refreshData();
}
/**
* Actualiza los datos.
*/
private void refreshData(){
checkBoxList.getItems().clear();
setTodosOption();
for(int a=1; a<getDataList().size(); a++){
CheckBox checkBox = new CheckBox(getDataList().get(a).toString());
checkBox.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent arg0) {
refreshLabel();
}
});
checkBoxList.getItems().add(checkBox);
}
}
/**
* Pone la opcion de todos al inicio del list view.
*/
private void setTodosOption(){
CheckBox checkBox = new CheckBox("Todos");
checkBox.selectedProperty().addListener(new ChangeListener<Boolean>(){
public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean newValue) {
for(int a=1; a<dataList.size(); a++){
checkBoxList.getItems().get(a).setSelected(newValue);
}
refreshLabel();
}
});
checkBoxList.getItems().add(checkBox);
}
/**
* Actualiza la etiqueta.
*/
private void refreshLabel(){
int size = getSelectedData().size();
comboLabel.setText(size+" Seleccionados");
}
/**
* Obtiene los datos que se hayan seleccionado.
* @return
*/
public List<T> getSelectedData(){
List<T> selList = new ArrayList<T>();
for(int a=1; a<dataList.size(); a++){
if(checkBoxList.getItems().get(a).isSelected()){
selList.add(dataList.get(a));
}
}
return selList;
}
}
Queda una chorrada mas o menos así......