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<JComboBoxItem> {
|
private Set<Integer> 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<JComboBoxItem> getSelectedItems() {
|
Set<JComboBoxItem> selectedItems = new HashSet<>();
|
for (Integer index : selectedIndices) {
|
selectedItems.add((JComboBoxItem) getItemAt(index));
|
}
|
return selectedItems;
|
}
|
|
public void setSelectedItems(Set<JComboBoxItem> items) {
|
selectedIndices.clear(); // 清空当前选中项
|
for (int i = 0; i < getItemCount(); i++) {
|
JComboBoxItem item = getItemAt(i);
|
if (items.contains(item)) {
|
selectedIndices.add(i); // 将对应的索引添加到选中集合
|
}
|
}
|
updateTextField(); // 更新文本框内容
|
}
|
}
|