miércoles, 16 de enero de 2013

ComboBox + CheckBox + JavaFX

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í......

No hay comentarios:

Publicar un comentario