Ver Mensaje Individual
  #3 (permalink)  
Antiguo 30/06/2019, 22:32
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

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