我有一个项目列表JList
供用户选择。由于项目很多(例如,各州的城市),我想将列表分成几个部分。但是,章节标题不应该是可选的。因此,对于我的城市/州示例,这可能如下所示:
- 状态 1
- 城市 1
- 城市 2
- 城市 3
- 状态 2
- 城市 4
- 城市 5
- 城市 6
JList
通过将s 嵌入到 custom 中自己编写这个并不难ListCellRenderer
,但我想知道那里是否已经有这样的类。
JIDE提供了一个组件,可以让您完全做到这一点。它被称为 GroupList:
也许通过使用JTree?你描述的是一棵有两个层次的树。
我看到这个问题已经得到解答,但我注意到罗伯特评论说他希望有一个开源解决方案。我建议使用 Glazed Lists 的分隔符列表,您可以在此处找到该 API:
http://publicobject.com/glazedlists/glazedlists-1.8.0/api/ca/odell/glazedlists/SeparatorList.html
下面是一些示例代码,它将生成按首字母分组的项目列表:
替代文字 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);
}
}
您可以使用 Apple 所谓的 SourceList。您可以在 iTunes 和 Mac OS X 的 Finder 中看到它们的作用。这是您描述的问题的优雅解决方案。
一个跨平台的开源 Java Swing 组件在这里: http ://explodingpixels.wordpress.com/2008/09/08/mac-widgets-for-java/