| 特性 | JList | JComboBox |
|---|---|---|
| 顯示模式 | 多行可見,支援多選 | 單行下拉,單選 |
| 資料建構 | 支援 String[]、Vector、ListModel | 需逐項 addItem() 或 setModel() |
| 滾動支援 | **需手動包裹 JScrollPane** | 內建下拉列表滾動 |
| 編輯性 | 預設唯讀,可配合 ListCellEditor | 可設為可編輯 setEditable(true) |
public class ListCombo extends JPanel {
public ListCombo() {
setLayout(new GridLayout(2, 1));
// JList:一行代碼建構,外加 JScrollPane
JList list = new JList(ButtonGroups.ids); // String[] 來源
add(new JScrollPane(list));
// JComboBox:動態添加 100 項
JComboBox combo = new JComboBox();
for (int i = 0; i < 100; i++)
combo.addItem(String.valueOf(i));
add(combo);
}
// main()...
}
list.setCellRenderer(new DefaultListCellRenderer() {
@Override public Component getListCellRendererComponent(
JList> list, Object value, int index, boolean sel, boolean focus) {
JLabel label = (JLabel) super.getListCellRendererComponent(...);
if (value instanceof User) {
User u = (User) value;
label.setText(u.getName() + " (" + u.getEmail() + ")");
label.setIcon(userIcon);
}
return label;
}
});
// 共享模型:列表與下拉框同步
DefaultListModel model = new DefaultListModel<>();
model.addElement("Item 1");
JList list = new JList(model);
JComboBox combo = new JComboBox(model); // 同一模型
// JList 選擇事件
list.addListSelectionListener(e -> {
if (!e.getValueIsAdjusting()) {
String selected = list.getSelectedValue();
// 處理選擇...
}
});
// JComboBox 動作事件
combo.addActionListener(e -> {
String selected = (String) combo.getSelectedItem();
// 處理選擇...
});
combo.setEditable(true);
// 可選:自動完成支援 (第三方庫或自定義 DocumentFilter)
JList 不自動滾動,資料多時必須包裹。DefaultListModel 分批載入或虛擬化列表。JComboBox (Java 7+) 避免未檢查轉型。JList 與 JComboBox 是 Swing 選擇類元件的雙子星。**記住:列表需自備滾動窗格,下拉框內建滾動**。善用模型分離與自定義渲染器,能輕鬆應對複雜業務呈現需求。