Pregunta

Tengo una lista de elementos en un JList para que el usuario seleccione. Ya que es una gran cantidad de artículos (por ejemplo, las ciudades en los estados), que quieren dividir la lista en secciones. Los títulos de las secciones no deben ser seleccionable, sin embargo. Así que para mis ciudades / ejemplo Unidos, esto podría tener este aspecto:

  • Estado 1
    • Ciudad 1
    • City 2
    • City 3
  • Estado 2
    • City 4
    • City 5
    • Ciudad 6

No sería tan difícil escribir esto mismo mediante la incorporación de JLists en un ListCellRenderer costumbre, pero me pregunto si ya existe una clase como la que hay.

¿Fue útil?

Solución

Veo esta pregunta ya está contestada, pero me di cuenta de que Robert comentó que él tenía la esperanza de una solución de código abierto. Me gustaría recomendar el uso separador de listas Las listas esmaltadas, la API para el que se puede encontrar aquí:

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

A continuación, algunos ejemplos de código que producirá una lista de elementos agrupados por su primera letra:

texto alternativo 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);
}

}

Otros consejos

Hay un componente disponible con JIDE que te permite hacer exactamente esto. Se llama lista_grupos:

text alt

Tal vez mediante el uso de JTree ? Lo que describes es un árbol con dos niveles.

Se puede usar lo que Apple llama a un SourceList. Se les ve en acción en iTunes y en el Finder de Mac OS X. Es una solución elegante al problema que usted describe.

Una multiplataforma, de código abierto de Java componente Swing para hacer esto es aquí: http://explodingpixels.wordpress.com/2008/09 / 08 / mac-widgets para-java /

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