package com.example.client.utils; import com.example.client.dto.JComboBoxItem; import javax.swing.*; import javax.swing.plaf.basic.BasicComboBoxEditor; import java.awt.*; import java.awt.event.*; import java.util.HashSet; import java.util.Set; public class MultiSelectComboBox extends JComboBox { private Set selectedIndices = new HashSet<>(); public MultiSelectComboBox(JComboBoxItem[] items) { super(items); setEditable(true); // 自定义渲染器 setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JCheckBox checkBox = new JCheckBox(); checkBox.setText(((JComboBoxItem) value).getName()); checkBox.setSelected(selectedIndices.contains(index)); // 修复选中状态判断 checkBox.setEnabled(list.isEnabled()); checkBox.setFont(list.getFont()); checkBox.setFocusPainted(false); checkBox.setBackground(isSelected ? list.getSelectionBackground() : list.getBackground()); checkBox.setForeground(isSelected ? list.getSelectionForeground() : list.getForeground()); return checkBox; } }); // 自定义编辑器 setEditor(new BasicComboBoxEditor() { @Override public void setItem(Object anObject) { super.setItem(anObject); updateTextField(); // 确保文本框显示所有选中的项 } }); // 添加动作监听器 addActionListener(e -> { int selectedIndex = getSelectedIndex(); if (selectedIndex != -1) { if (selectedIndices.contains(selectedIndex)) { selectedIndices.remove(selectedIndex); } else { selectedIndices.add(selectedIndex); } updateTextField(); // 更新文本框内容 } }); // 添加焦点监听器 addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { updateTextField(); // 确保在失去焦点时更新文本框内容 } }); } private void updateTextField() { StringBuilder sb = new StringBuilder(); for (Integer index : selectedIndices) { if (sb.length() > 0) { sb.append(","); } sb.append(((JComboBoxItem) getItemAt(index)).getName()); } ((JTextField) getEditor().getEditorComponent()).setText(sb.toString()); } public Set getSelectedItems() { Set selectedItems = new HashSet<>(); for (Integer index : selectedIndices) { selectedItems.add((JComboBoxItem) getItemAt(index)); } return selectedItems; } }