Domanda

Ho un elenco di voci in un JList per l'utente di scegliere.Poiché si tratta di un sacco di oggetti (ad esempio, città in stati), voglio dividere la lista in due sezioni.Le intestazioni di sezione non dovrebbe essere selezionabile, però.Quindi per la mia città/stati di esempio, questo potrebbe assomigliare a questo:

  • Stato 1
    • Città 1
    • Città 2
    • Città 3
  • Stato 2
    • City 4
    • Città 5
    • Città 6

Non sarebbe così difficile scrivere questo a me stesso di incorporamento JLists custom ListCellRenderer, ma mi chiedo se c'è già una classe come quello che c'è fuori.

È stato utile?

Soluzione

Vedo che questa domanda è già una risposta, ma ho notato che Robert ha commentato che speravo in una soluzione open source.Mi consiglia di utilizzare Vetri Liste' Separatore di elenco, l'API per il quale si può essere trovato qui:

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

Ecco un esempio di codice che produrrà un elenco di elementi raggruppati secondo la loro prima lettera:

il testo alt 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);
}

}

Altri suggerimenti

C'è un componente disponibile con JIDE che ti permette di fare esattamente questo.Si chiama GroupList:

alt text

Forse utilizzando JTree ?Ciò che si descrive è un Albero con due livelli.

Si potrebbe utilizzare quello che Apple chiama un SourceList.Li vedi in azione in iTunes e Mac OS X Finder.Si tratta di un'elegante soluzione per il problema che tu descrivi.

Un cross-piattaforma open source di Java Swing componente per fare questo si trova qui:http://explodingpixels.wordpress.com/2008/09/08/mac-widgets-for-java/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top