我有一个JList
中的项目列表供用户选择。由于这是很多项目(比如说州内的城市),我想将列表分成几部分。不过,节标题不应该选择。因此,对于我的城市/州来说,这可能是这样的:Java/Swing中的分区列表?
- 状态1
- 市1
- 市2
- 市3
- 国家2
- 城市4
- 市5
- 市6
它不会那么难通过自定义ListCellRenderer
嵌入JList
s到这个写我自己,但我不知道是否已经有这样一类在那里。
我有一个JList
中的项目列表供用户选择。由于这是很多项目(比如说州内的城市),我想将列表分成几部分。不过,节标题不应该选择。因此,对于我的城市/州来说,这可能是这样的:Java/Swing中的分区列表?
它不会那么难通过自定义ListCellRenderer
嵌入JList
s到这个写我自己,但我不知道是否已经有这样一类在那里。
我看到这个问题已经回答了,但我注意到,罗伯特评论说,他所期待的开源解决方案。我推荐使用釉面列表分隔符列表,该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);
}
}通过banjollity建议
也许使用JTree?你所描述的是一个有两层的树。
树会过度复杂化UI。那里的树太多了。 – 2009-05-17 14:36:56
汤姆是对的,一棵树可能会工作,但这是一个错误的比喻。我在这个问题上的插图不是很好,但banjolity的截图显示了我的意思。 – 2009-05-17 18:52:09
有一个可用于JIDE的组件可以让你完全做到这一点。这就是所谓的群组列表:
就是这样!谢谢!我曾希望得到一些开放源码的东西(我忘了说这是用于开源项目),但是看起来他们对于在开源项目中使用有很好的策略。如果有人可以推荐一个开源版本,我仍然会理解这一点。 – 2009-05-17 18:54:44
你可以使用苹果公司称之为SOURCELIST。你可以在iTunes和Mac OS X的Finder中看到它们的动作。这是您描述的问题的优雅解决方案。
一个跨平台的,这样做的开源Java Swing组件是在这里: http://explodingpixels.wordpress.com/2008/09/08/mac-widgets-for-java/
这不是我正在寻找与我的问题在这里 - 但我一直在Java寻找这种事情一段时间。好东西,谢谢! – 2009-05-18 11:29:39
的基德类是伟大的,但如果有人能提出一个纯粹的开源组件,我也会对此感兴趣(我忘了说这是用于开源项目)。 此外,谢谢汤姆将类名更正为“ListCellRenderer”。 – 2009-05-17 19:01:00