Pergunta

Foi um tempo desde que eu postei aqui, e agora estou em um ponto onde eu me encontro preso mais uma vez.

Para a minha missão na uni, que foram convidados a criar uma aplicação de livro de endereço. Ele está indo bem, e ele está quase concluída, no entanto, uma parte do projeto, que é puramente minha preferência, me escapa. Eu não estou pedindo ajuda em qualquer parte da atribuição que vai me ganhar marcas, só para ficar claro. Eu posso enviar a especificação se alguém gostaria evidência disso. (/ Divulgação)

A parte da aplicação é a importação e exportação a partir de um tipo de arquivo personalizado e o formato vCard. Isso funciona bem. O tipo de arquivo personalizado detém vários contatos, com apenas 4 linhas por contato. Porque mantém vários contatos, uma nova janela é aberta, que pede ao usuário para selecionar os contatos que desejam ser exportados para o arquivo. Este contém uma JList, onde o usuário pode selecionar os contatos e exportar o arquivo, não há problema.

O que tenho tentado fazer, é criar um renderizador de célula personalizado que permitirá o uso de uma caixa de seleção na JList. Eu quase tenho esta trabalhando, olhando aqui ( http: / /java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer ) e aqui ( http://www.jroller.com/santhosh/entry/jlist_with_checkboxes ), porém sem sorte. O primeiro link explica como criar o renderizador de célula personalizado, mas não verificar boxs, eo segundo explica como fazer boxs de seleção. Posso obter boxs de seleção para exibir, no entanto, em seguida, que é tudo o que é exibido.

Neste último exemplo, a caixa é-se deve ser clicado para que os membros da lista a ser selecionados. O que eu gostaria de ser capaz de fazer, é permitir que o usuário clique em ambos os itens da lista ou a caixa de seleção de para selecionar o item.

Na versão de Caixas de verificação apenas que fui trabalhando, a seleção trabalhou, no entanto ctrl ainda tinha que ser pressionado por vários itens a serem selecionados. Existe alguma maneira de fazê-lo assim ctrl não é necessário para a seleção múltipla de itens? Eu sei que você pode ler modificadores em um clique, mas não tem idéia se você pode aplicá-los a um clique de um objeto especificado.

Seus pensamentos, comentários, sugestões, links e respostas exatas são todos muito bem-vindos! :)

Foi útil?

Solução

Este não é, de certa forma; embora seja essencialmente falsificado porque as caixas realmente não fazer nada, mas verificá-los faz selecionar o item da 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);
      }

   }

}

Outras dicas

Gostaria de usar um JTable e adicionar a caixa de seleção como uma coluna separada.

Você pode então adicionar um MouseListener para a mesa e sempre que a outra coluna está marcada você alternar o valor da caixa de seleção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top