Pregunta

Ha pasado un tiempo desde que publiqué aquí, y ahora estoy en un punto en el que me encuentro atrapado otra vez.

Para mi asignación en la universidad, se nos ha pedido que creemos una aplicación de libreta de direcciones. Va bien, y está casi terminado, sin embargo, una parte del proyecto, que es puramente mi preferencia, me elude. No estoy pidiendo ayuda en ninguna parte de la tarea que me permita obtener una puntuación, solo para dejarlo claro. Puedo subir la especificación si alguien quisiera evidencia de eso. (/ revelación)

Parte de la aplicación es importar y exportar desde un tipo de archivo personalizado y el formato vcard. Esto funciona bien. El tipo de archivo personalizado tiene múltiples contactos, con solo 4 líneas por contacto. Debido a que tiene múltiples contactos, se abre una nueva ventana que le pide al usuario que seleccione los contactos que desea exportar al archivo. Este contiene una lista de tareas, donde el usuario puede seleccionar los contactos y exportar el archivo, sin problemas.

Lo que he estado tratando de hacer, es crear un procesador de celdas personalizado que permita el uso de una casilla de verificación en la lista JList. Casi me puse a trabajar trabajando aquí ( http: / /java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer ) y aquí ( http://www.jroller.com/santhosh/entry/jlist_with_checkboxes ), sin embargo, no hay suerte. El primer enlace explica cómo crear el procesador de celdas personalizado, pero no las casillas de verificación, y el segundo explica cómo hacer las casillas de verificación. Puedo obtener casillas de verificación para mostrar, sin embargo, eso es TODO lo que muestra.

En el último ejemplo, se debe hacer clic en los cuadros para que se seleccione a los miembros de la lista. Lo que me gustaría poder hacer es permitir al usuario hacer clic en los elementos de la lista o en las casillas de verificación para seleccionar el elemento.

En la versión de las casillas de verificación en las que trabajé, la selección funcionó, sin embargo, aún era necesario mantener presionada la tecla Ctrl para que se seleccionaran varios elementos. ¿Hay alguna forma de hacerlo para que no sea necesario ctrl para la selección múltiple de elementos? Sé que puede leer modificadores con un clic, pero no tengo idea si puede aplicarlos a un clic de un objeto específico.

¡Tus pensamientos, comentarios, sugerencias, enlaces y respuestas exactas son muy bienvenidos! :)

¿Fue útil?

Solución

Esto lo hace, más o menos; aunque es esencialmente falso porque las casillas de verificación realmente no hacen nada, pero al seleccionarlas selecciona el elemento de la lista.

import java.awt.Component;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;


public class Relequestual extends JFrame {

   private final FunkyCellRendererComponent funkyCRC = new FunkyCellRendererComponent();

   public Relequestual() {
      getContentPane().setLayout(new FlowLayout());

      String[] items = { "Item 1", "Item 2", "Item 3", "Item 4" };
      JList theList = new JList(items);
      theList.setCellRenderer(
      new ListCellRenderer() {
         @Override
         public Component getListCellRendererComponent(JList list, Object value, int index,
               boolean isSelected, boolean cellHasFocus) {
            funkyCRC.setup(list, value, index, isSelected, cellHasFocus);
            return funkyCRC;
         }
      });
      getContentPane().add(theList);

   }

   /**
    * @param args
    */
   public static void main(String[] args) {
      Relequestual gui = new Relequestual();
      gui.pack();
      gui.setVisible(true);
   }

   class FunkyCellRendererComponent extends JPanel {

      private JCheckBox checkBox = new JCheckBox();
      private JLabel label = new JLabel();
      private JList list;
      private int index;

      public FunkyCellRendererComponent() {
         super(null);
         setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
         add(this.checkBox);
         add(this.label);
      }

      public void setup(JList list, Object value, int index,
               boolean isSelected, boolean cellHasFocus) {
         this.list = list;
         this.index = index;
         this.label.setText((String) list.getModel().getElementAt(index)); 
         if (isSelected) {
            setForeground(list.getSelectionForeground());
            setBackground(list.getSelectionBackground());
         } else {
            setForeground(list.getForeground());
            setBackground(list.getBackground());
         }
         this.checkBox.setSelected(isSelected);
      }

   }

}

Otros consejos

Yo usaría una JTable y agregaría la casilla de verificación como una columna separada.

Luego, puede agregar un MouseListener a la tabla y cada vez que se marque la otra columna, alternará el valor de la casilla de verificación.

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