Javaswing中下拉复选滚动框

在这里插入图片描述


/**
 * @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);
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值