getSelectedValuesList() 返回選中元素列表JScrollPaneString[] data = {"Mon", "Tue", "Wed"};
JList<String> list = new JList<>(data); // 構造時一次性注入
// 運行後無法增刪改
DefaultListModel<String> model = new DefaultListModel<>();
JList<String> list = new JList<>(model);
// 增
model.addElement("Thu");
// 刪
model.remove(0); // 或 model.removeElement("Mon")
// 改
model.set(1, "Tue2");
// 查
model.getElementAt(0);
list.addListSelectionListener(e -> {
if (e.getValueIsAdjusting()) return; // 忽略調整過程中的中間事件
List<String> selected = list.getSelectedValuesList();
for (String s : selected) {
textArea.append(s + "\n");
}
});
關鍵點:getValueIsAdjusting() 為 true 表示選擇尚在變化中(如拖拽),應直接返回避免重複觸發。
public class ListDemo extends JFrame {
private DefaultListModel<String> model = new DefaultListModel<>();
private JList<String> list = new JList<>(model);
private JTextArea area = new JTextArea(10, 20);
public ListDemo() {
model.addElement("Item 1");
model.addElement("Item 2");
JButton btnAdd = new JButton("添加");
btnAdd.addActionListener(e -> model.addElement("New " + (model.size()+1)));
JButton btnDel = new JButton("刪除選中");
btnDel.addActionListener(e -> {
List<String> sel = list.getSelectedValuesList();
for (String s : sel) model.removeElement(s);
});
list.addListSelectionListener(e -> {
if (!e.getValueIsAdjusting()) {
area.setText(String.join("\n", list.getSelectedValuesList()));
}
});
setLayout(new BorderLayout());
add(new JScrollPane(list), BorderLayout.WEST);
add(new JScrollPane(area), BorderLayout.CENTER);
add(btnAdd, BorderLayout.NORTH);
add(btnDel, BorderLayout.SOUTH);
pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true);
}
public static void main(String[] args) { new ListDemo(); }
}
JScrollPane 導致數據超出可視區無法查看getValueIsAdjusting() 導致選擇事件重複觸發