Pergunta

Eu tenho uma lista de itens em um JList para o usuário selecionar. Desde que é um monte de itens (digamos, cidades em estados), eu quero dividir a lista em seções. Os títulos das seções não devem ser selecionáveis, no entanto. Assim, para minhas cidades / estados exemplo, isso pode ter esta aparência:

  • State 1
    • City 1
    • City 2
    • City 3
  • State 2
    • City 4
    • City 5
    • Cidade 6

Não seria tão difícil escrever isso mesmo incorporando JLists em um ListCellRenderer costume, mas eu estou querendo saber se já existe uma classe como essa lá fora.

Foi útil?

Solução

Eu vejo essa pergunta já foi respondida, mas eu notei que Robert comentou que ele estava esperando por uma solução de código aberto. Eu recomendo usar separador de lista envidraçadas listas, a API para o qual pode ser encontrada aqui:

http://publicobject.com /glazedlists/glazedlists-1.8.0/api/ca/odell/glazedlists/SeparatorList.html

Aqui está um código de exemplo que irá produzir uma lista de itens agrupados por sua primeira carta:

alt texto http://img300.imageshack.us/img300/8977/separatorlist .png

public class SeparatorListTest {

private static Comparator<String> createComparator() {
    return new Comparator<String>() {
        public int compare(String stringOne, String stringTwo) {
            return stringOne.substring(0,1).compareTo(stringTwo.substring(0,1));
        }
    };
}

private static ListCellRenderer createListCellRenderer() {
    return new DefaultListCellRenderer() {
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

            if (value instanceof SeparatorList.Separator) {
                SeparatorList.Separator separator = (SeparatorList.Separator) value;
                label.setText(separator.getGroup().get(0).toString().substring(0,1));
                label.setFont(label.getFont().deriveFont(Font.BOLD));
                label.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
            } else {
                label.setFont(label.getFont().deriveFont(Font.PLAIN));
                label.setBorder(BorderFactory.createEmptyBorder(0,15,0,0));
            }

            return label;
        }
    };
}

public static void main(String[] args) {
    EventList<String> rawList = GlazedLists.eventListOf(
            "apple", "appricot", "acorn", "blueberry", "coconut", "chesnut", "grape");
    SeparatorList<String> separatorList = 
            new SeparatorList<String>(rawList, createComparator(), 1, 1000);

    JList list = new JList(new EventListModel<String>(separatorList));
    list.setCellRenderer(createListCellRenderer());
    JScrollPane scrollPane = new JScrollPane(list);
    scrollPane.setBorder(null);

    JFrame frame = new JFrame();
    frame.add(scrollPane, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200,200);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

}

Outras dicas

Há um componente disponível com JIDE que permite que você faça exatamente isso. É chamado groupList:

text alt

Talvez usando JTree ? O que você descreve é ??uma árvore com dois níveis.

Você pode usar o que a Apple chama de SourceList. Você vê-los em ação no iTunes e no Finder do Mac OS X. É uma solução elegante para o problema que você descreve.

A multi-plataforma, o componente Java Swing open source para fazer isso é aqui: http://explodingpixels.wordpress.com/2008/09 / 08 / mac-widgets para-java /

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