2009-05-17 10 views
1

Ich habe eine Liste von Elementen in einem JList für den Benutzer zu wählen. Da es viele Dinge gibt (zB Städte in Staaten), möchte ich die Liste in Abschnitte unterteilen. Die Abschnittsüberschriften sollten jedoch nicht auswählbar sein. Also für meine Städte/Beispiel heißt es, dies könnte wie folgt aussehen:Unterteilte Liste in Java/Swing?

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

Es wäre nicht so schwierig sein, dies selbst ListCellRenderer durch Einbetten JList s in einem benutzerdefinierten zu schreiben, aber ich frage mich, ob es bereits eine Klasse wie das ist dort draußen.

+0

Die JIDE Klassen von banjollity vorgeschlagen sind groß, aber wenn jemand eine reine Open-Source vorschlagen könnte Komponente, würde mich auch interessieren (ich habe vergessen zu sagen, dass dies für ein Open-Source-Projekt ist). Auch dank Tom für die Klassennamen zu 'ListCellRenderer' zu korrigieren. –

Antwort

1

ich diese Frage sehen bereits beantwortet, aber ich merkte, dass Robert kommentierte, dass er für eine Open-Source-Lösung hatte gehofft. Ich würde empfehlen, glasierte Listen Separator Liste verwenden, die API für die Sie hier finden:

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

Hier einige Beispielcode, der eine Liste von Elementen gruppiert nach ihren Anfangsbuchstaben produzieren:

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

}

+0

Danke, das sieht wirklich interessant aus. Ich habe am Ende meine eigene Sektion Liste gehackt, weil ich keine Lust hatte eine große Bibliothek einzubauen, nur um diese eine Komponente zu bekommen. Es funktioniert, aber es ist nicht perfekt. GlazedLists sieht aus, als könnte es die Rechnung wirklich gut passen. –

3

Vielleicht durch JTree mit? Was Sie beschreiben, ist ein Baum mit zwei Ebenen.

+1

Ein Baum würde die Benutzeroberfläche übermäßig komplizieren. Es gibt viel zu viele Bäume da draußen. –

+0

Tom richtig ist, wäre ein Baum vielleicht funktionieren, aber es ist die falsche Metapher. Meine Illustration in der Frage war nicht sehr gut, aber der Screenshot von banjolity zeigt, was ich meine. –

4

Es gibt eine Komponente mit JIDE zur Verfügung, dass wir Sie genau dies tun. Es Grouplist genannt:

alt text

+0

Genau das ist es! Vielen Dank!Ich hatte auf etwas Open Source gehofft (ich habe vergessen zu sagen, dass dies für ein Open-Source-Projekt gedacht ist), aber es sieht so aus, als hätten sie eine gute Richtlinie für den Einsatz in Open-Source-Projekten. Wenn jemand eine Open-Source-Version vorschlagen kann, würde ich das dennoch begrüßen. –

0

Sie könnten verwenden, was Apple ein Source nennt. Sie sehen sie in iTunes und in Mac OS X Finder in Aktion. Es ist eine elegante Lösung für das Problem, das Sie beschreiben.

Eine Cross-Plattform, Swing-Komponente Open-Source-Java, dies zu tun ist hier: http://explodingpixels.wordpress.com/2008/09/08/mac-widgets-for-java/

+0

Das war nicht wirklich das, wonach ich mit meiner Frage gesucht habe - aber ich habe diese Art von Dingen in Java schon eine Weile gesucht. Tolles Zeug, danke! –