Pregunta

¿Cuál sería la mejor manera de tener una lista de elementos con una casilla de verificación de cada uno en Java Swing?

I. e.un JList con los elementos que tienen algo de texto y una casilla de verificación de cada uno de ellos?

¿Fue útil?

Solución

Crear una personalizada ListCellRenderer y asignamos a la JList.

Esta costumbre ListCellRenderer debe devolver un JCheckbox en el implementantion de getListCellRendererComponent(...) método.

Pero este JCheckbox no será editable, es una simple pintura en la pantalla, es hasta usted para elegir cuando este JCheckbox debe ser marcada o no,

Por ejemplo, mostrar marcada cuando la fila es seleccionado (parámetro isSelected), pero de esta manera el estado de verificación no será gestionada si cambia la selección.Su mejor mostrar comprobado consultar los datos por debajo de la ListModel, pero entonces depende de usted para poner en práctica el método que cambia el estado de verificación de los datos, y notificar el cambio a la JList para ser repintada.

Voy a publicar el código de muestra más adelante, si usted lo necesita

ListCellRenderer

Otros consejos

Una maravillosa respuesta es esta CheckBoxList.Se implementa Telcontar la respuesta (a pesar de que 3 años antes :)...Lo estoy usando en Java 1.6 sin problemas.También he añadido un addCheckbox método como este (seguramente podría ser más corto, no ha utilizado Java en un tiempo):

public void addCheckbox(JCheckBox checkBox) {
    ListModel currentList = this.getModel();
    JCheckBox[] newList = new JCheckBox[currentList.getSize() + 1];
    for (int i = 0; i < currentList.getSize(); i++) {
        newList[i] = (JCheckBox) currentList.getElementAt(i);
    }
    newList[newList.length - 1] = checkBox;
    setListData(newList);
}

He probado la demo de la Jidesoft cosas, jugando con el CheckBoxList Me encontré con algunos problemas (conductas que no funciona).Voy a modificar esta respuesta si yo tengo problemas con el CheckBoxList He ligado.

Probablemente estaría buscando a utilizar un JTable en lugar de una JList y desde la representación predeterminada de una casilla de verificación es bastante feo, yo probablemente estaría buscando a caer en una costumbre TableModel, CellRenderer y CellEditor para representar un valor booleano.Por supuesto, me imagino que esto se ha hecho un bajillion veces ya.El sol ha buenos ejemplos.

Acaba de implementar un ListCellRenderer

public class CheckboxListCellRenderer extends JCheckBox implements ListCellRenderer {

    public Component getListCellRendererComponent(JList list, Object value, int index, 
            boolean isSelected, boolean cellHasFocus) {

        setComponentOrientation(list.getComponentOrientation());
        setFont(list.getFont());
        setBackground(list.getBackground());
        setForeground(list.getForeground());
        setSelected(isSelected);
        setEnabled(list.isEnabled());

        setText(value == null ? "" : value.toString());  

        return this;
    }
}

y establecer el renderizador

JList list = new JList();
list.setCellRenderer(new CheckboxListCellRenderer());

esto resultará en

CheckboxListCellRenderer example

Los detalles en Personalizado swing componente representadores.

PS:Si desea que los elementos de radio basta con sustituir extends JCheckbox con extends JRadioButton.

La mejor solución para Java 7 y versiones posteriores

Me topé con esta pregunta y se dio cuenta de que algunas de las respuestas son bastante viejos y obsoletos.Hoy en día, JList es genérico y por lo tanto no son las mejores soluciones.

Mi solución de los genéricos JCheckBoxList:

import java.awt.Component;

import javax.swing.*;
import javax.swing.border.*;

import java.awt.event.*;

@SuppressWarnings("serial")
public class JCheckBoxList extends JList<JCheckBox> {
  protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

  public JCheckBoxList() {
    setCellRenderer(new CellRenderer());
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        int index = locationToIndex(e.getPoint());
        if (index != -1) {
          JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index);
          checkbox.setSelected(!checkbox.isSelected());
          repaint();
        }
      }
    });
    setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  }

  public JCheckBoxList(ListModel<JCheckBox> model){
    this();
    setModel(model);
  }

  protected class CellRenderer implements ListCellRenderer<JCheckBox> {
    public Component getListCellRendererComponent(
        JList<? extends JCheckBox> list, JCheckBox value, int index,
        boolean isSelected, boolean cellHasFocus) {
      JCheckBox checkbox = value;

      //Drawing checkbox, change the appearance here
      checkbox.setBackground(isSelected ? getSelectionBackground()
          : getBackground());
      checkbox.setForeground(isSelected ? getSelectionForeground()
          : getForeground());
      checkbox.setEnabled(isEnabled());
      checkbox.setFont(getFont());
      checkbox.setFocusPainted(false);
      checkbox.setBorderPainted(true);
      checkbox.setBorder(isSelected ? UIManager
          .getBorder("List.focusCellHighlightBorder") : noFocusBorder);
      return checkbox;
    }
  }
}

Para agregar dinámicamente JCheckBox listas que necesita para crear su propio ListModel o agregar el DefaultListModel.

DefaultListModel<JCheckBox> model = new DefaultListModel<JCheckBox>();
JCheckBoxList checkBoxList = new JCheckBoxList(model);

El DefaultListModel son genéricos y por lo tanto usted puede utilizar los métodos especificados por la API de JAVA 7 aquí como este:

model.addElement(new JCheckBox("Checkbox1"));
model.addElement(new JCheckBox("Checkbox2"));
model.addElement(new JCheckBox("Checkbox3"));

Las probabilidades son buenas w/ Java que alguien ya ha puesto el widget o la utilidad que necesitas.Parte de los beneficios de un gran OSS de la comunidad.No hay necesidad de reinventar la rueda a menos que usted realmente desea hacerlo usted mismo.En este caso sería un buen ejercicio de aprendizaje en intérpretes de celda cellrenderer y Editores.

Mi proyecto ha tenido un gran éxito con JIDE.El componente que desea, una Casilla de Verificación de la Lista, es en el JIDE Capa Común (que es OSS y alojado en java.net).Las cosas de la publicidad es buena, pero no la necesita.

http://www.jidesoft.com/products/oss.htm https://jide-oss.dev.java.net/

Te recomiendo que uses un JPanel con un GridLayout de 1 columna.Agregar las casillas de verificación para el JPanel, y establecer el JPanel como el origen de datos de un JScrollPane.Y para obtener las Casillas de verificación seleccionadas, simplemente llame a la getComponents() de la JPanel para obtener las Casillas de verificación.

Aquí es sólo una pequeña adición a la JCheckBoxList por Rawa.Esto agregará la capacidad de seleccionar utilizando la barra de espacio.Si se seleccionan varios elementos, todo se pondrá a la invertida valor del primer elemento.

        addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            int index = getSelectedIndex();
            if (index != -1 && e.getKeyCode() == KeyEvent.VK_SPACE) {
                boolean newVal = !((JCheckBox) (getModel()
                        .getElementAt(index))).isSelected();
                for (int i : getSelectedIndices()) {
                    JCheckBox checkbox = (JCheckBox) getModel()
                            .getElementAt(i);
                    checkbox.setSelected(newVal);
                    repaint();
                }
            }
        }
        });

Todos los de la suma de los componentes de Swing, es decir, a los componentes de otros componentes, tales como JTable, JTree, o Jtree--puede ser altamente personalizado.Por ejemplo, un componente JTable normalmente muestra una cuadrícula de JLabel componentes, pero también puede mostrar JButtons, JTextFields, o incluso de otros JTables.Para obtener estos agregado de componentes para mostrar que no es el predeterminado de los objetos es la parte fácil, sin embargo.Hacerlos responder adecuadamente a teclado y ratón de eventos es una tarea más difícil, debido a la Oscilación de la separación de los componentes en "visualizadores" y "editores". Esta separación fue (en mi opinión) una mala elección de diseño y sólo sirve para complicar las cosas cuando se trata de extender los componentes Swing.

A ver lo que quiero decir, tratar de mejorar el Swing del JList componente de manera que muestre las casillas de verificación en lugar de etiquetas.De acuerdo a la Oscilación de la filosofía, esta tarea requiere la ejecución de dos interfaces:ListCellRenderer (para dibujar las casillas de verificación) y CellEditor (para el manejo del teclado y los eventos de ratón en las casillas de verificación).La aplicación de la ListCellRenderer interfaz es bastante fácil, pero el CellEditor interfaz puede ser bastante torpe y difícil de entender.En este caso en particular, sugiero que olvidar CellEditor completamente y a manejar eventos de entrada directamente, como se muestra en el código siguiente.

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;

public class CheckBoxList extends JList
{
   protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

   public CheckBoxList()
   {
      setCellRenderer(new CellRenderer());

      addMouseListener(new MouseAdapter()
         {
            public void mousePressed(MouseEvent e)
            {
               int index = locationToIndex(e.getPoint());

               if (index != -1) {
                  JCheckBox checkbox = (JCheckBox)
                              getModel().getElementAt(index);
                  checkbox.setSelected(
                                     !checkbox.isSelected());
                  repaint();
               }
            }
         }
      );

      setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
   }

   protected class CellRenderer implements ListCellRenderer
   {
      public Component getListCellRendererComponent(
                    JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus)
      {
         JCheckBox checkbox = (JCheckBox) value;
         checkbox.setBackground(isSelected ?
                 getSelectionBackground() : getBackground());
         checkbox.setForeground(isSelected ?
                 getSelectionForeground() : getForeground());
         checkbox.setEnabled(isEnabled());
         checkbox.setFont(getFont());
         checkbox.setFocusPainted(false);
         checkbox.setBorderPainted(true);
         checkbox.setBorder(isSelected ?
          UIManager.getBorder(
           "List.focusCellHighlightBorder") : noFocusBorder);
         return checkbox;
      }
   }
}

Aquí, yo interceptar los clics del ratón en el cuadro de lista y simular un clic en la casilla que corresponda.El resultado es un "CheckBoxList" componente que es a la vez más simple y más pequeño que un componente equivalente utilizando el CellEditor de la interfaz.Para utilizar la clase, simplemente instancia, a continuación, pasar un array de objetos JCheckBox (o subclases de objetos JCheckBox) llamando setListData.Tenga en cuenta que las casillas de verificación en este componente no responde a las pulsaciones de teclas (es decir,la barra espaciadora), pero siempre se puede añadir su propio detector de teclas si es necesario.

Fuente: DevX.com

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top