/**
* @author .
*/
public class MultiComboBox extends JComponent implements ActionListener {
private LinkedHashMap<String, String> values;
private MultiPopup popup;
private JTextField editor;
protected JButton arrowButton;
public MultiComboBox(LinkedHashMap<String, String> value) {
values = value;
initComponent();
}
private void initComponent() {
this.setLayout(new BorderLayout());
popup = new MultiPopup(values);
popup.setBorder(BorderFactory.createLineBorder(color));//设置面板边框颜色
int height = 100;
height = values.size() * 100;
if ( height > 200 ) height = 200;
popup.setPopupSize(322, height);
popup.setBackground(color);
editor = new JTextField();
editor.setFont(new Font(Res.FONT, Font.PLAIN, Res.FONT_SIZE_INPUT));
editor.setEditable(false);
editor.setBorder(BorderFactory.createLineBorder(new Color(181, 181, 181), 1, true));
editor.setPreferredSize(new Dimension(280, 22));
editor.addActionListener(this);
editor.setBackground(color);
arrowButton = createArrowButton();
arrowButton.setBorder(BorderFactory.createLineBorder(new Color(181, 181, 181), 1, true));
arrowButton.setBackground(color);
arrowButton.addActionListener(this);
add(editor, BorderLayout.WEST);
add(arrowButton, BorderLayout.CENTER);
this.setBackground(color);
}
/**
* 获取选中的数据
*/
public Object[] getSelectedValues() {
return popup.getSelectedValues();
}
/**
* 设置需要选中的值
*/
public void setSelectValues(Object[] selectvalues) {
popup.setSelectValues(selectvalues);
setText(selectvalues);
}
private void setText(Object[] values) {
if ( values.length > 0 ) {
String value = Arrays.toString(values);
value = value.replace("[", "");
value = value.replace("]", "");
editor.setText(value);
} else {
editor.setText("");
}
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if ( !popup.isVisible() ) {
popup.show(this, 0, getHeight());
}
}
protected JButton createArrowButton() {
JButton button = new BasicArrowButton(BasicArrowButton.SOUTH, UIManager.getColor("ComboBox.buttonBackground"),
UIManager.getColor("ComboBox.buttonShadow"), UIManager.getColor("ComboBox.buttonDarkShadow"),
UIManager.getColor("ComboBox.buttonHighlight"));
button.setName("ComboBox.arrowButton");
button.setBorder(BorderFactory.createLineBorder(color, 1, true));
button.setBackground(color);
return button;
}
/**
* @param path
* @return
*/
public static String getSaasCommonImg(String path) {
return String.format("/saas/common/%s", path);
}
/**
* @param path
* @return
*/
public static String getSaasImgPath(String path) {
return String.format("/saas/%s", path);
}
//内部类MultiPopup
public class MultiPopup extends JPopupMenu implements ActionListener {
private LinkedHashMap<String, String> values;
private java.util.List<JCheckBox> checkBoxList = new ArrayList<JCheckBox>();
public MultiPopup(LinkedHashMap<String, String> value) {
super();
values = value;
initComponent();
}
private void initComponent() {
JPanel checkboxPane = new JPanel();
checkboxPane.setBackground(color);
JPanel buttonPane = new JPanel();
// this.setLayout(new BorderLayout());
for (Map.Entry<String, String> entry : values.entrySet()) {
JCheckBox temp = new JCheckBox(entry.getKey(), IC_SEL);
temp.setBackground(color);
temp.setFont(new Font(Res.FONT, Font.PLAIN, Res.FONT_SIZE_BTN));
checkBoxList.add(temp);
}
checkboxPane.setBounds(0, 0, 280, 170);
checkboxPane.setBorder(BorderFactory.createLineBorder(color));//设置面板边框颜色
checkboxPane.setLayout(new GridLayout(checkBoxList.size(), 0, 5, 5));
for (JCheckBox box : checkBoxList) {
box.setIcon(IC_SEL);
box.setSelectedIcon(IC_SEL_P);
box.setBackground(color);
box.addActionListener((ActionListener) changeEvent -> {
JCheckBox source = (JCheckBox) changeEvent.getSource();
if ( "全选".equals(source.getText()) ) {
if ( checkBoxList.get(0).isSelected() ) {
for (int i = 1; i < checkBoxList.size(); i++) {
if ( !checkBoxList.get(i).isSelected() ) {
checkBoxList.get(i).setSelected(true);
checkBoxList.get(i).setSelectedIcon(IC_SEL_P);
}
}
} else {
for (int i = 1; i < checkBoxList.size(); i++) {
if ( checkBoxList.get(i).isSelected() ) {
checkBoxList.get(i).setSelected(false);
}
}
}
} else {
int check = 0;
for (int i = 1; i < checkBoxList.size(); i++) {
if ( checkBoxList.get(i).isSelected() ) {
check++;
}
}
checkBoxList.get(0).setSelected(checkBoxList.size() - 1 == check ? true : false);
}
setSelectValues(getSelectedValues());
});
checkboxPane.add(box);
}
commitButton = new JButton("确定");
commitButton.addActionListener(this);
commitButton.setBackground(Color.RED);
cancelButton = new JButton("取消");
cancelButton.addActionListener(this);
jScrollPane = new JScrollPane();
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPane.setBounds(0, 0, 290, 170);
jScrollPane.setBackground(color);
jScrollPane.setBorder(BorderFactory.createLineBorder(color));//设置面板边框颜色
jScrollPane.getViewport().add(checkboxPane);
jScrollPane.getVerticalScrollBar().setBackground(color);
jScrollPane.getHorizontalScrollBar().setBackground(color);
jScrollPane.validate();
this.add(jScrollPane, BorderLayout.CENTER);
this.setBackground(color);
this.setBorder(BorderFactory.createLineBorder(color));
}
public void setSelectValues(Object[] values) {
if ( values.length > 0 ) {
for (int i = 0; i < values.length; i++) {
for (int j = 0; j < checkBoxList.size(); j++) {
if ( values[i].equals(checkBoxList.get(j).getText()) ) {
checkBoxList.get(j).setSelected(true);
checkBoxList.get(j).setSelectedIcon(IC_SEL_P);
}
}
}
setText(getSelectedValues());
}
}
public Object[] getSelectedValues() {
List<Object> selectedValues = new ArrayList<Object>();
if ( checkBoxList.get(0).isSelected() ) {
int count = checkBoxList.size() - 1;
selectedValues.add("全选 " + "(" + count + ")");
} else {
for (int i = 0; i < checkBoxList.size(); i++) {
if ( !checkBoxList.get(i).isSelected() && StringUtils.equals(checkBoxList.get(i).getText(), "全选") ) {
selectedValues.add("");
continue;
} else if ( checkBoxList.get(i).isSelected() ) {
for (Map.Entry<String, String> entry : values.entrySet()) {
if ( checkBoxList.get(i).isSelected() && StringUtils.equals(checkBoxList.get(i).getText(), entry.getKey()) ) {
selectedValues.add(String.valueOf(entry.getKey()));
}
}
}
}
}
if ( "".equals(selectedValues.get(0)) ) {
selectedValues.remove(0);
}
if ( 0 == selectedValues.size() ) {
selectedValues.add("");
}
return selectedValues.toArray(new Object[selectedValues.size()]);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Object source = arg0.getSource();
if ( source instanceof JButton ) {
JButton button = (JButton) source;
if ( button.equals(commitButton) ) {
setText(getSelectedValues());
popup.setVisible(false);
} else if ( button.equals(cancelButton) ) {
popup.setVisible(false);
}
}
}
}
private static final ImageIcon IC_SEL = ImageManager.getImgIcon(getSaasCommonImg("radio_uncheck.png"), 25, 25);
private static final ImageIcon IC_SEL_P = ImageManager.getImgIcon(getSaasCommonImg("checkex2.png"), 25, 25);
/**
* 确定
*/
private JButton commitButton;
/**
* 取消
*/
private JButton cancelButton;
private JScrollPane jScrollPane;
private Color color = new Color(230, 230, 230);
}
Javaswing中下拉复选滚动框
于 2023-01-18 11:03:12 首次发布