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 originalpackage app.vista.util.combo.select;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
public AbstractComboModel
(String xcriterio
) { this.criterio = xcriterio;
}
@Override
public void setSelectedItem
(Object anItem
) { if ((selection != null && !selection.equals(anItem))
|| selection == null && anItem != null) {
selection = anItem;
fireContentsChanged(this, -1, -1);
}
}
@Override
public Object getSelectedItem
() { return selection;
}
return criterio;
}
public void setCriterio
(String criterio
) { this.criterio = criterio;
}
}
Ahora la clase de selección multiple es esta:
Código Java:
Ver originalpackage app.vista.util.combo.select;
import java.util.ArrayList;
public abstract class ComboModelMultiSelection<E> extends AbstractComboModel {
private ArrayList<E> content;
private ArrayList<E> selection;
public ComboModelMultiSelection
(String xcriterio
) { super(xcriterio);
}
public ComboModelMultiSelection
(String xcriterio, ArrayList
<E
> xselection
) { super(xcriterio);
selection = xselection;
}
@Override
public int getSize() {
return content.size();
}
@Override
public E getElementAt(int index) {
return content.get(index);
}
public void search
(String xcriterio
){ content = (!xcriterio.isEmpty()) ? prepareFilter(xcriterio)
: selection;
fireContentsChanged(this, 0, content.size() -1);
}
public void addSelection(E object){
if(!selection.contains(object)){
selection.add(object);
}
}
public void delSelection(E object){
selection.remove(object);
}
public ArrayList<E> getSelecteds(){
return selection;
}
abstract protected ArrayList
<E
> prepareFilter
(String xcriterio
); }
Y el modelo que lo hederara:
Código Java:
Ver originalpackage app.vista.util.combo.modelos;
import app.vista.util.combo.select.ComboModelMultiSelection;
import app.contr.clases.Servicio;
import app.contr.man.ServiciosContr;
import java.util.ArrayList;
public class MultiModeloServicioCombo extends ComboModelMultiSelection<Servicio> {
public MultiModeloServicioCombo(){
super("");
}
public MultiModeloServicioCombo(ArrayList<Servicio> xselection){
super("",xselection);
}
@Override
protected ArrayList
<Servicio
> prepareFilter
(String xcriterio
){ return ServiciosContr.getInstance().findbySearch(xcriterio);
}
}
En el modelo que usaremos en el formulario, debe estar como variable local para que funcione:
Código Java:
Ver originalpackage app.vista.interfaz;
import app.contr.clases.Servicio;
import app.contr.man.ServiciosContr;
import app.vista.util.combo.celdas.CeldaServicioCombo;
import app.vista.util.combo.modelos.MultiModeloServicioCombo;
import app.vista.util.combo.modelos.SimpleModeloServicioCombo;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class probando
extends javax.
swing.
JFrame { MultiModeloServicioCombo modelo = new MultiModeloServicioCombo();
public probando() {
initComponents();
cboxpruebasimple.
getEditor().
getEditorComponent().
addKeyListener(new KeyAdapter() { @Override
String criterio
= cboxpruebasimple.
getEditor().
getItem().
toString(); cargarServiciosSimple(criterio);
});
}
});
cboxpruebamulti.
getEditor().
getEditorComponent().
addKeyListener(new KeyAdapter() { @Override
String criterio
= cboxpruebamulti.
getEditor().
getItem().
toString(); cargarServiciosMulti(criterio);
});
}
});
}
private void cargarServiciosSimple
(String criterio
){ SimpleModeloServicioCombo mod = new SimpleModeloServicioCombo(criterio.toUpperCase());
if(mod.getSize() > 0){
cboxpruebasimple.setModel(mod);
cboxpruebasimple.setRenderer(new CeldaServicioCombo());
cboxpruebasimple.setSelectedItem(criterio);
cboxpruebasimple.showPopup();
} else {
cboxpruebasimple.hidePopup();
}
}
private void cargarServiciosMulti
(String criterio
){ modelo.search(criterio.toUpperCase());
if(modelo.getSize() > 0){
cboxpruebamulti.setModel(modelo);
cboxpruebamulti.setRenderer(new CeldaServicioCombo());
cboxpruebamulti.setSelectedItem(criterio);
cboxpruebamulti.showPopup();
} else {
cboxpruebamulti.hidePopup();
}
}
private void btnaddActionPerformed
(java.
awt.
event.
ActionEvent evt
) { if(cboxpruebamulti.getSelectedIndex() < 0){
JOptionPane.
showMessageDialog(null,
"Seleccione un servicio"); } else {
Servicio s = ServiciosContr.getInstance().findByNombre(cboxpruebamulti.getSelectedItem().toString());
((MultiModeloServicioCombo)cboxpruebamulti.getModel()).addSelection(s);
cboxpruebamulti.setSelectedItem(null);
cargarServiciosMulti("");
}
}
private void btndelActionPerformed
(java.
awt.
event.
ActionEvent evt
) { if(cboxpruebamulti.getSelectedIndex() < 0){
JOptionPane.
showMessageDialog(null,
"Seleccione un servicio"); } else {
Servicio s = ServiciosContr.getInstance().findByNombre(cboxpruebamulti.getSelectedItem().toString());
((MultiModeloServicioCombo)cboxpruebamulti.getModel()).delSelection(s);
cboxpruebamulti.setSelectedItem(null);
cargarServiciosMulti("");
}
}
// Variables declaration - do not modify
private javax.
swing.
JButton btnadd
; private javax.
swing.
JButton btndel
; private javax.swing.JComboBox<String> cboxpruebamulti;
private javax.swing.JComboBox<String> cboxpruebasimple;
private javax.
swing.
JPanel pnlmultiseleccion
; private javax.
swing.
JPanel pnlpantalla
; private javax.
swing.
JPanel pnlsimpleseleccion
; // End of variables declaration
}
Y con esto se soluciona el problema, espero que algún día adapten el del ejemplo para hacerlo funcionar.
Gracias!