Ver Mensaje Individual
  #5 (permalink)  
Antiguo 02/07/2019, 13:39
Avatar de detective_jd
detective_jd
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: JCombobox multi seleccionable

Problema resuelto, la solución que hice no era nada lo que quería pero tampoco es mala, el cellrenderer no cambia en nada de hecho se lo puede adaptar a gusto de uno pero los comboModel no, la primer clase abstracta no cambia:

Código Java:
Ver original
  1. package app.vista.util.combo.select;
  2. import javax.swing.AbstractListModel;
  3. import javax.swing.ComboBoxModel;
  4. abstract class AbstractComboModel extends AbstractListModel
  5.     implements ComboBoxModel {
  6.     private Object selection;  
  7.     private String criterio;
  8.     public AbstractComboModel(String xcriterio) {
  9.         this.criterio = xcriterio;
  10.     }    
  11.     @Override
  12.     public void setSelectedItem(Object anItem) {
  13.         if ((selection != null && !selection.equals(anItem))
  14.             || selection == null && anItem != null) {
  15.             selection = anItem;
  16.             fireContentsChanged(this, -1, -1);
  17.         }
  18.     }
  19.     @Override
  20.     public Object getSelectedItem() {
  21.         return selection;
  22.     }
  23.     public String getCriterio() {
  24.         return criterio;
  25.     }
  26.     public void setCriterio(String criterio) {
  27.         this.criterio = criterio;
  28.     }        
  29. }

Ahora la clase de selección multiple es esta:

Código Java:
Ver original
  1. package app.vista.util.combo.select;
  2. import java.util.ArrayList;
  3. public abstract class ComboModelMultiSelection<E> extends AbstractComboModel {
  4.     private ArrayList<E> content;
  5.     private ArrayList<E> selection;
  6.     public ComboModelMultiSelection(String xcriterio) {
  7.         super(xcriterio);
  8.         content = new ArrayList();
  9.         selection = new ArrayList();
  10.     }
  11.     public ComboModelMultiSelection(String xcriterio, ArrayList<E> xselection) {
  12.         super(xcriterio);
  13.         content = new ArrayList();
  14.         selection = xselection;
  15.     }
  16.     @Override
  17.     public int getSize() {
  18.         return content.size();
  19.     }
  20.     @Override
  21.     public E getElementAt(int index) {
  22.         return content.get(index);
  23.     }
  24.     public void search(String xcriterio){
  25.         content = (!xcriterio.isEmpty()) ? prepareFilter(xcriterio)
  26.             : selection;
  27.         fireContentsChanged(this, 0, content.size() -1);
  28.     }
  29.     public void addSelection(E object){
  30.         if(!selection.contains(object)){
  31.             selection.add(object);
  32.         }
  33.     }
  34.     public void delSelection(E object){
  35.         selection.remove(object);        
  36.     }
  37.     public ArrayList<E> getSelecteds(){
  38.         return selection;
  39.     }
  40.     abstract protected ArrayList<E> prepareFilter(String xcriterio);
  41. }

Y el modelo que lo hederara:

Código Java:
Ver original
  1. package app.vista.util.combo.modelos;
  2. import app.vista.util.combo.select.ComboModelMultiSelection;
  3. import app.contr.clases.Servicio;
  4. import app.contr.man.ServiciosContr;
  5. import java.util.ArrayList;
  6. public class MultiModeloServicioCombo extends ComboModelMultiSelection<Servicio> {
  7.     public MultiModeloServicioCombo(){
  8.         super("");
  9.     }
  10.     public MultiModeloServicioCombo(ArrayList<Servicio> xselection){
  11.         super("",xselection);
  12.     }
  13.     @Override
  14.     protected ArrayList<Servicio> prepareFilter(String xcriterio){
  15.         return ServiciosContr.getInstance().findbySearch(xcriterio);
  16.     }
  17. }

En el modelo que usaremos en el formulario, debe estar como variable local para que funcione:

Código Java:
Ver original
  1. package app.vista.interfaz;
  2. import app.contr.clases.Servicio;
  3. import app.contr.man.ServiciosContr;
  4. import app.vista.util.combo.celdas.CeldaServicioCombo;
  5. import app.vista.util.combo.modelos.MultiModeloServicioCombo;
  6. import app.vista.util.combo.modelos.SimpleModeloServicioCombo;
  7. import java.awt.event.KeyAdapter;
  8. import java.awt.event.KeyEvent;
  9. import javax.swing.JOptionPane;
  10. import javax.swing.SwingUtilities;
  11. public class probando extends javax.swing.JFrame {
  12.     MultiModeloServicioCombo modelo = new MultiModeloServicioCombo();
  13.     public probando() {
  14.         initComponents();        
  15.         cboxpruebasimple.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
  16.             @Override
  17.             public void keyReleased(KeyEvent e) {
  18.                 SwingUtilities.invokeLater(() -> {
  19.                     String criterio = cboxpruebasimple.getEditor().getItem().toString();
  20.                     cargarServiciosSimple(criterio);
  21.                 });
  22.             }            
  23.         });
  24.         cboxpruebamulti.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
  25.             @Override
  26.             public void keyReleased(KeyEvent e) {
  27.                 SwingUtilities.invokeLater(() -> {
  28.                     String criterio = cboxpruebamulti.getEditor().getItem().toString();
  29.                     cargarServiciosMulti(criterio);
  30.                 });
  31.             }            
  32.         });
  33.     }
  34.     private void cargarServiciosSimple(String criterio){
  35.         SimpleModeloServicioCombo mod = new SimpleModeloServicioCombo(criterio.toUpperCase());
  36.         if(mod.getSize() > 0){
  37.             cboxpruebasimple.setModel(mod);
  38.             cboxpruebasimple.setRenderer(new CeldaServicioCombo());
  39.             cboxpruebasimple.setSelectedItem(criterio);
  40.             cboxpruebasimple.showPopup();
  41.         } else {
  42.             cboxpruebasimple.hidePopup();
  43.         }
  44.     }
  45.     private void cargarServiciosMulti(String criterio){
  46.         modelo.search(criterio.toUpperCase());        
  47.         if(modelo.getSize() > 0){
  48.             cboxpruebamulti.setModel(modelo);
  49.             cboxpruebamulti.setRenderer(new CeldaServicioCombo());
  50.             cboxpruebamulti.setSelectedItem(criterio);
  51.             cboxpruebamulti.showPopup();
  52.         } else {
  53.             cboxpruebamulti.hidePopup();
  54.         }
  55.     }
  56.  
  57.     private void btnaddActionPerformed(java.awt.event.ActionEvent evt) {                                      
  58.         if(cboxpruebamulti.getSelectedIndex() < 0){
  59.             JOptionPane.showMessageDialog(null, "Seleccione un servicio");
  60.         } else {
  61.             Servicio s = ServiciosContr.getInstance().findByNombre(cboxpruebamulti.getSelectedItem().toString());
  62.             ((MultiModeloServicioCombo)cboxpruebamulti.getModel()).addSelection(s);
  63.             cboxpruebamulti.setSelectedItem(null);
  64.             cargarServiciosMulti("");
  65.         }
  66.     }                                      
  67.  
  68.     private void btndelActionPerformed(java.awt.event.ActionEvent evt) {                                      
  69.         if(cboxpruebamulti.getSelectedIndex() < 0){
  70.             JOptionPane.showMessageDialog(null, "Seleccione un servicio");
  71.         } else {
  72.             Servicio s = ServiciosContr.getInstance().findByNombre(cboxpruebamulti.getSelectedItem().toString());
  73.             ((MultiModeloServicioCombo)cboxpruebamulti.getModel()).delSelection(s);
  74.             cboxpruebamulti.setSelectedItem(null);
  75.             cargarServiciosMulti("");
  76.         }
  77.     }                                      
  78.  
  79.     // Variables declaration - do not modify                    
  80.     private javax.swing.JButton btnadd;
  81.     private javax.swing.JButton btndel;
  82.     private javax.swing.JComboBox<String> cboxpruebamulti;
  83.     private javax.swing.JComboBox<String> cboxpruebasimple;
  84.     private javax.swing.JPanel pnlmultiseleccion;
  85.     private javax.swing.JPanel pnlpantalla;
  86.     private javax.swing.JPanel pnlsimpleseleccion;
  87.     // End of variables declaration                  
  88. }

Y con esto se soluciona el problema, espero que algún día adapten el del ejemplo para hacerlo funcionar.

Gracias!
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias