Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] JCombobox multi seleccionable

Estas en el tema de JCombobox multi seleccionable en el foro de Java en Foros del Web. Buenas a todos, ando un poco resignado y quería preguntarles lo siguiente, teniendo este código: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Java: Ver original package app.vista.util.combo.celdas ; import ...
  #1 (permalink)  
Antiguo 26/06/2019, 12:30
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
JCombobox multi seleccionable

Buenas a todos, ando un poco resignado y quería preguntarles lo siguiente, teniendo este código:

Código Java:
Ver original
  1. package app.vista.util.combo.celdas;
  2. import java.awt.*;
  3. import javax.swing.*;
  4. import javax.swing.border.EmptyBorder;
  5. public abstract class AbstractComboRenderer implements ListCellRenderer {
  6.     @Override
  7.     public Component getListCellRendererComponent(JList list, Object value,
  8.         int index, boolean isSelected, boolean cellHasFocus) {
  9.         JTextPane data = prepareData(value);
  10.         if (index % 2 == 0) {
  11.             colourColumn(data, Color.LIGHT_GRAY);            
  12.         } else {
  13.             colourColumn(data, Color.WHITE);            
  14.         }
  15.         if(isSelected){
  16.             colourColumn(data, Color.PINK);            
  17.         }
  18.         return data;
  19.     }
  20.     protected void colourColumn(JTextPane ta,Color xc){
  21.         ta.setBackground(xc);
  22.         ta.setForeground(Color.BLACK);
  23.     }
  24.     protected JTextPane prepareData(Object value){
  25.         JTextPane data = new JTextPane();                
  26.         data.setOpaque(true);        
  27.         data.setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  28.         data.setBorder(new EmptyBorder(5, 10, 5, 10));
  29.         data.setForeground(Color.BLACK);        
  30.         data.setText("» " + displayData(value));
  31.         return data;
  32.     }
  33.     abstract protected String displayData(Object value);
  34. }

Código Java:
Ver original
  1. package app.vista.util.combo.celdas;
  2. import app.contr.clases.Servicio;
  3. public class CeldaServicioCombo extends AbstractComboRenderer {
  4.     @Override
  5.     protected String displayData(Object value) {
  6.         Servicio servicio = (Servicio) value;
  7.         return servicio.getNombre();
  8.     }
  9. }

Código Java:
Ver original
  1. package app.vista.util.combo.modelos;
  2. import javax.swing.AbstractListModel;
  3. import javax.swing.ComboBoxModel;
  4. public 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. }

Código Java:
Ver original
  1. package app.vista.util.combo.modelos;
  2. import app.contr.man.ServiciosContr;
  3. import app.contr.clases.Servicio;
  4. import java.util.ArrayList;
  5. public class ModeloServicioCombo extends AbstractComboModel {
  6.     private ArrayList<Servicio> servicios;
  7.     public ModeloServicioCombo(String xcriterio) {
  8.         super(xcriterio);
  9.         servicios = ServiciosContr.getInstance().findbySearch(xcriterio);
  10.     }
  11.     @Override
  12.     public int getSize() {
  13.         return servicios.size();
  14.     }
  15.     @Override
  16.     public Servicio getElementAt(int index) {
  17.         return servicios.get(index);
  18.     }  
  19. }

Código Java:
Ver original
  1. package app.vista.interfaz;
  2. import app.vista.util.combo.modelos.ModeloServicioCombo;
  3. import app.vista.util.combo.celdas.CeldaServicioCombo;
  4. import java.awt.event.KeyAdapter;
  5. import java.awt.event.KeyEvent;
  6. import javax.swing.SwingUtilities;
  7. public class probando extends javax.swing.JFrame {
  8.     public probando() {
  9.         initComponents();
  10.         cboxprueba.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
  11.             @Override
  12.             public void keyReleased(KeyEvent e) {
  13.                 SwingUtilities.invokeLater(() -> {
  14.                     String criterio = cboxprueba.getEditor().getItem().toString();
  15.                     cargarServicios(criterio);
  16.                 });
  17.             }            
  18.         });
  19.     }
  20.     private void cargarServicios(String criterio){
  21.         ModeloServicioCombo modelo = new ModeloServicioCombo(
  22.             criterio.toUpperCase());        
  23.         if(modelo.getSize() > 0){
  24.             cboxprueba.setModel(modelo);
  25.             cboxprueba.setRenderer(new CeldaServicioCombo());
  26.             cboxprueba.setSelectedItem(criterio);
  27.             cboxprueba.showPopup();
  28.         } else {
  29.             cboxprueba.hidePopup();
  30.         }
  31.     }
  32.     @SuppressWarnings("unchecked")                        
  33.     // Variables declaration - do not modify                    
  34.     private javax.swing.JComboBox<String> cboxprueba;
  35.     private javax.swing.JPanel pnlpantalla;
  36.     // End of variables declaration                  
  37. }

¿cómo puedo hacer para que al seleccionar opciones que me así?

|EMERGENCIA X| |MEDICINA X|

¿y que al seleccionar por ejemplo medicina se quedandome así?

|EMERGENCIA X|

Intenté basarme en el siguiente link pero estoy usando Apache Netbeans 11 y en el código lo crea todo a mano: Select multiple JCheckBox in JComboBox

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #2 (permalink)  
Antiguo 29/06/2019, 21:01
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: JCombobox multi seleccionable

Buenas a todos, resulta que puedo seleccionar más de un elemento así:

Código Java:
Ver original
  1. package app.vista.util.combo.modelos;
  2. import app.contr.man.ServiciosContr;
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.util.HashSet;
  6. import javax.swing.JCheckBox;
  7. import javax.swing.JList;
  8. import javax.swing.ListCellRenderer;
  9. public class CheckRenderer extends JCheckBox implements ListCellRenderer {
  10.         private HashSet instructionHashset=new HashSet();
  11.         int t = ServiciosContr.getInstance().findAll(null).size();
  12.         public JCheckBox[] cbl = new JCheckBox[t];
  13.         public CheckRenderer() {
  14.             setOpaque(true);
  15.             for(int i = 0; i < t; i ++) {
  16.                 cbl[i] = new JCheckBox();
  17.             }
  18.         }
  19.         @Override
  20.         public Component getListCellRendererComponent(JList list, Object value,
  21.             int index, boolean isSelected, boolean cellHasFocus) {
  22.             if (index > -1) {
  23.                 cbl[index].setText(value.toString());
  24.                 cbl[index].setBackground(isSelected ? Color.green : Color.white);
  25.                 cbl[index].setForeground(isSelected ? Color.white : Color.black);
  26.                 if(cbl[index].isSelected()) {
  27.                     getInstructionHashset().add(value);
  28.                 } else {
  29.                     getInstructionHashset().remove(value);
  30.                 }
  31.                 return cbl[index];
  32.             }
  33.             return cbl[0];
  34.         }
  35.             public HashSet getInstructionHashset() {
  36.         return instructionHashset;
  37.     }
  38. }

Código Java:
Ver original
  1. package app.vista.interfaz;
  2. import app.vista.util.combo.modelos.ModeloServicioCombo;
  3. import app.vista.util.combo.modelos.CheckRenderer;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.KeyAdapter;
  7. import java.awt.event.KeyEvent;
  8. import javax.swing.SwingUtilities;
  9. public class probando extends javax.swing.JFrame {
  10.     public probando() {
  11.         initComponents();
  12.  
  13.         cboxprueba.addActionListener(new ActionListener() {
  14.             @Override
  15.             public void actionPerformed(ActionEvent arg0) {
  16.                 int sel = cboxprueba.getSelectedIndex();
  17.                 if (sel == 0) {
  18.                     cboxprueba.getUI().setPopupVisible(cboxprueba, false);
  19.                 } else if (sel > 0 && sel < cboxprueba.getModel().getSize()) {
  20.                     ((CheckRenderer)cboxprueba.getRenderer()).cbl[sel].setSelected(!((CheckRenderer)cboxprueba.getRenderer()).cbl[sel].isSelected());
  21.                 }
  22.             }
  23.         });
  24.         cboxprueba.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
  25.             @Override
  26.             public void keyReleased(KeyEvent e) {
  27.                 SwingUtilities.invokeLater(() -> {
  28.                     String criterio = cboxprueba.getEditor().getItem().toString();
  29.                     cargarServicios(criterio);
  30.                 });
  31.             }            
  32.         });
  33.     }
  34.     private void cargarServicios(String criterio){
  35.         ModeloServicioCombo modelo = new ModeloServicioCombo(
  36.             criterio.toUpperCase());        
  37.         if(modelo.getSize() > 0){
  38.             cboxprueba.setModel(modelo);
  39.             //cboxprueba.setRenderer(new CeldaServicioCombo());
  40.             cboxprueba.setRenderer(new CheckRenderer());
  41.             cboxprueba.setSelectedItem(criterio);
  42.             cboxprueba.showPopup();
  43.         } else {
  44.             cboxprueba.hidePopup();
  45.         }
  46.     }
  47.  
  48.     // Variables declaration - do not modify                    
  49.     private javax.swing.JComboBox<String> cboxprueba;
  50.     private javax.swing.JPanel pnlpantalla;
  51.     // End of variables declaration                  
  52. }

Siempre y cuando no escribe en el combobox porque me borra las selecciones, además cuando filtro y selecciono lo del filtro no me permite seleccionar el 1ero, si el 2do.
Primero quiero lograr que ande bien las selecciones, para luego seguir con poner lo seleccionado en el jcombobox como dije al principio.

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #3 (permalink)  
Antiguo 30/06/2019, 22:32
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: JCombobox multi seleccionable

Bueno, bueno, si uso el código del ejemplo, así nomás anda bien:

Código Java:
Ver original
  1. package prueba;
  2. import java.awt.*;
  3. import javax.swing.*;
  4. public class Cuerpo extends JPanel {
  5.     private Cuerpo() {
  6.         super(new BorderLayout());
  7.         CheckableItem[] m = {
  8.             new CheckableItem("aaa", false),
  9.             new CheckableItem("bbbbb", true),
  10.             new CheckableItem("111", false),
  11.             new CheckableItem("33333", true),
  12.             new CheckableItem("2222", true),
  13.             new CheckableItem("ccccccc", false)
  14.         };
  15.         JPanel p = new JPanel(new GridLayout(0, 1));
  16.         p.setBorder(BorderFactory.createEmptyBorder(5, 20, 5, 20));
  17.         p.add(new JLabel("Default:"));
  18.         p.add(new JComboBox<>(m));
  19.         p.add(Box.createVerticalStrut(20));
  20.         p.add(new JLabel("CheckedComboBox:"));
  21.         p.add(new CheckedComboBox<>(new CheckableComboBoxModel<>(m)));
  22.         add(p, BorderLayout.NORTH);
  23.         setPreferredSize(new Dimension(320, 240));
  24.     }
  25.     public static void main(String... args) {
  26.         EventQueue.invokeLater(new Runnable() {
  27.             @Override public void run() {
  28.                 createAndShowGui();
  29.             }
  30.         });
  31.     }
  32.     public static void createAndShowGui() {
  33.         try {
  34.             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  35.             ex.printStackTrace();
  36.         }
  37.         JFrame frame = new JFrame("CheckedComboBox");
  38.         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  39.         frame.getContentPane().add(new Cuerpo());
  40.         frame.pack();
  41.         frame.setLocationRelativeTo(null);
  42.         frame.setVisible(true);
  43.     }
  44. }

Código Java:
Ver original
  1. package prueba;
  2. import java.awt.AWTEvent;
  3. import java.awt.Dimension;
  4. import java.awt.event.*;
  5. import javax.accessibility.Accessible;
  6. import javax.swing.*;
  7. import javax.swing.plaf.basic.ComboPopup;
  8. public class CheckedComboBox <E extends CheckableItem> extends JComboBox<E> {
  9.     private boolean keepOpen;
  10.     private transient ActionListener listener;
  11.     protected CheckedComboBox() {
  12.         super();
  13.     }
  14.     protected CheckedComboBox(ComboBoxModel<E> model) {
  15.         super(model);
  16.     }
  17.     @Override
  18.     public Dimension getPreferredSize() {
  19.         return new Dimension(200, 20);
  20.     }
  21.     @Override
  22.     public void updateUI() {
  23.         setRenderer(null);
  24.         removeActionListener(listener);
  25.         super.updateUI();
  26.         listener = e -> {
  27.             if ((e.getModifiers() & AWTEvent.MOUSE_EVENT_MASK) != 0) {
  28.                 updateItem(getSelectedIndex());
  29.                 keepOpen = true;
  30.             }
  31.         };
  32.         setRenderer(new CheckBoxCellRenderer<>());
  33.         addActionListener(listener);
  34.         getInputMap(JComponent.WHEN_FOCUSED).put(
  35.             KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "checkbox-select");
  36.         getActionMap().put("checkbox-select", new AbstractAction() {
  37.             @Override public void actionPerformed(ActionEvent e) {
  38.                 Accessible a = getAccessibleContext().getAccessibleChild(0);
  39.                 if (a instanceof ComboPopup) {
  40.                     updateItem(((ComboPopup) a).getList().getSelectedIndex());
  41.                 }
  42.             }
  43.         });
  44.     }
  45.     protected void updateItem(int index) {
  46.         if (isPopupVisible()) {
  47.             CheckableItem item = getItemAt(index);
  48.             item.setSelected(!item.isSelected());
  49.             ComboBoxModel<E> m = getModel();
  50.             if (m instanceof CheckableComboBoxModel) {
  51.                 ((CheckableComboBoxModel<E>) m).fireContentsChanged(index);
  52.             }
  53.         }
  54.     }
  55.     @Override
  56.     public void setPopupVisible(boolean v) {
  57.         if (keepOpen) {
  58.             keepOpen = false;
  59.         } else {
  60.             super.setPopupVisible(v);
  61.         }
  62.     }
  63. }

Código Java:
Ver original
  1. package prueba;
  2. public class CheckableItem {
  3.     private final String text;
  4.     private boolean selected;
  5.     protected CheckableItem(String text, boolean selected) {
  6.         this.text = text;
  7.         this.selected = selected;
  8.     }
  9.     public boolean isSelected() {
  10.         return selected;
  11.     }
  12.     public void setSelected(boolean selected) {
  13.         this.selected = selected;
  14.     }
  15.     @Override
  16.     public String toString() {
  17.         return text;
  18.     }
  19. }

Código Java:
Ver original
  1. package prueba;
  2. import javax.swing.DefaultComboBoxModel;
  3. public class CheckableComboBoxModel <E> extends DefaultComboBoxModel<E> {
  4.     @SuppressWarnings("PMD.UseVarargs")
  5.     public CheckableComboBoxModel(E[] items) {
  6.         super(items);
  7.     }
  8.     public void fireContentsChanged(int index) {
  9.         super.fireContentsChanged(this, index, index);
  10.     }
  11. }

Código Java:
Ver original
  1. package prueba;
  2. import java.awt.Component;
  3. import java.util.Objects;
  4. import java.util.stream.Collectors;
  5. import java.util.stream.IntStream;
  6. import javax.swing.*;
  7. public class CheckBoxCellRenderer<E extends CheckableItem> implements ListCellRenderer<E> {
  8.     private final JTextField label = new JTextField(" ");
  9.     private final JCheckBox check = new JCheckBox(" ");
  10.     @Override
  11.     public Component getListCellRendererComponent(JList<? extends E> list, E value,
  12.         int index, boolean isSelected, boolean cellHasFocus) {
  13.         if (index < 0) {
  14.             String txt = getCheckedItemString(list.getModel());
  15.             label.setText(txt.isEmpty() ? " " : txt);
  16.             return label;
  17.         } else {
  18.             check.setText(Objects.toString(value, ""));
  19.             check.setSelected(value.isSelected());
  20.             if (isSelected) {
  21.                 check.setBackground(list.getSelectionBackground());
  22.                 check.setForeground(list.getSelectionForeground());
  23.             } else {
  24.                 check.setBackground(list.getBackground());
  25.                 check.setForeground(list.getForeground());
  26.             }
  27.             return check;
  28.         }
  29.     }
  30.     private static <E extends CheckableItem> String getCheckedItemString(
  31.         ListModel<E> model) {
  32.         return IntStream.range(0, model.getSize())
  33.             .mapToObj(model::getElementAt)
  34.             .filter(CheckableItem::isSelected)
  35.             .map(Objects::toString)
  36.             .sorted()
  37.             .collect(Collectors.joining(", "));
  38.     }
  39. }

Sin tocarle el código funciona bien, solo copien su código y verán a lo que me refiero, ahora si hago lo mismo con un jframe directamente no me pone nada, lo único que le cambio es esto:

Código Java:
Ver original
  1. package app.vista.interfaz;
  2. import app.vista.util.CheckableComboBoxModel;
  3. import app.vista.util.CheckableItem;
  4. import app.vista.util.CheckedComboBox;
  5. public class probando extends javax.swing.JFrame {
  6.     public probando() {
  7.         initComponents();
  8.         CheckableItem[] m = {
  9.             new CheckableItem("aaa", false),
  10.             new CheckableItem("bbbbb", true),
  11.             new CheckableItem("111", false),
  12.             new CheckableItem("33333", true),
  13.             new CheckableItem("2222", true),
  14.             new CheckableItem("ccccccc", false)
  15.         };
  16.         cboxprueba = new CheckedComboBox(new CheckableComboBoxModel(m));        
  17.         /*
  18.         cboxprueba.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
  19.             @Override
  20.             public void keyReleased(KeyEvent e) {
  21.                 SwingUtilities.invokeLater(() -> {
  22.                     String criterio = cboxprueba.getEditor().getItem().toString();
  23.                     cargarServicios(criterio);
  24.                 });
  25.             }            
  26.         });*/
  27.     }
  28.     /*
  29.     private void cargarServicios(String criterio){
  30.         ModeloServicioCombo modelo = new ModeloServicioCombo(
  31.             criterio.toUpperCase());        
  32.         if(modelo.getSize() > 0){
  33.             cboxprueba.setModel(modelo);
  34.             //cboxprueba.setRenderer(new CeldaServicioCombo());
  35.             cboxprueba.setRenderer(new CheckBoxCellRenderer());
  36.             cboxprueba.setSelectedItem(criterio);
  37.             cboxprueba.showPopup();
  38.         } else {
  39.             cboxprueba.hidePopup();
  40.         }
  41.     }*/
  42.  
  43.     // Variables declaration - do not modify                    
  44.     private javax.swing.JComboBox<String> cboxprueba;
  45.     private javax.swing.JPanel pnlpantalla;
  46.     // End of variables declaration                  
  47. }

¿Ustedes le encuentran la falla? porque no lo he hecho.

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #4 (permalink)  
Antiguo 02/07/2019, 13:38
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
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
  #5 (permalink)  
Antiguo 02/07/2019, 13:39
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
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

Etiquetas: jcombobox, multi
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:15.