我有一個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