2009-05-17 6 views
1

У меня есть список элементов в JList для выбора. Поскольку много предметов (например, городов в штатах), я хочу разделить список на разделы. Однако заголовки разделов не должны выбираться. Так что для моих городов/утверждает пример, это может выглядеть следующим образом:Секционный список на Java/Swing?

  • Состояние 1
    • City 1
    • City 2
    • Сити 3
  • Штат 2
    • Город 4
    • City 5
    • City 6

Это не было бы так трудно написать это сам встраивая JList с в пользовательском ListCellRenderer, но мне интересно, если там уже есть класс так там.

+0

в Jide классы предложено banjollity велики, но если кто-то может предложить чистый с открытым исходным кодом компонент, мне тоже это было бы интересно (я забыл сказать, что это для использования в проекте с открытым исходным кодом). Кроме того, спасибо Тому за исправление имени класса в 'ListCellRenderer'. –

ответ

1

Я вижу этот вопрос уже ответил, но я заметил, что Роберт заметил, что он надеется на решение с открытым исходным кодом. Я бы рекомендовал использовать список Сепаратор застекленные Списки, то API, для которого можно найти здесь:

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

Вот пример кода, который будет производить список элементов, сгруппированных по их первой букве:

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

Спасибо, это выглядит действительно интересно. В конце концов я закончил свой собственный секционный список, потому что мне не хотелось включать большую библиотеку, чтобы получить этот один компонент. Это работает, но это не идеально. GlazedLists выглядит так, как будто он вполне соответствует действительности. –

3

Возможно, используя JTree? То, что вы описываете, - это дерево с двумя уровнями.

+1

Дерево будет чрезмерно усложнять интерфейс. Там слишком много деревьев. –

+0

Том прав, дерево, возможно, сработает, но это неправильная метафора. Моя иллюстрация в вопросе была не очень хорошая, но скриншот banjolity показывает, что я имею в виду. –

4

Имеется компонент, имеющий JIDE, который позволит вам выполнить именно это. Это называется списке групп:

alt text

+0

Это точно! Благодаря!Я надеялся на что-то открытое (я забыл сказать, что это для использования в проекте с открытым исходным кодом), но похоже, что у них есть хорошая политика в использовании в проектах с открытым исходным кодом. Если кто-то может предложить версию с открытым исходным кодом, я все равно буду признателен за это. –

0

Вы можете использовать то, что компания Apple называет SOURCELIST. Вы видите их в действии в iTunes и в Finder Mac OS X. Это изящное решение проблемы, которую вы описываете.

кросс-платформенный, с открытым исходным кодом Java компонент Качели делать это здесь: http://explodingpixels.wordpress.com/2008/09/08/mac-widgets-for-java/

+0

Это не совсем то, что я искал с моим вопросом здесь, но я искал такого рода вещи на Java некоторое время. Отличный материал, спасибо! –