Lista en Java seccionado / Oscilación?
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 JList
s en un ListCellRenderer
costumbre, pero me pregunto si ya existe una clase como la que hay.
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:
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 /