Java获取CheckedComboBox的值

时间:2016-10-06 05:54:26

标签: java jcombobox jcheckbox

我已按照此tutorial创建了一个checkcombobox控件,但我不知道如何从控件中获取所选值,并将其显示在控制台中。这是我的代码片段:

CheckableItem[] sizes = {
            new CheckableItem("2T/3T",false),
            new CheckableItem("4T",false),
            new CheckableItem("5T",false),
            new CheckableItem("4",false),
            new CheckableItem("6",false),
            new CheckableItem("8",false),
            new CheckableItem("10",false)
    };

    CheckedComboBox<CheckableItem> cmbSizes = new CheckedComboBox<CheckableItem>(new DefaultComboBoxModel<CheckableItem>(sizes));

请注意,完整的控制类可以在提供的链接中下载。

这是CheckedComboBox的类代码:

class CheckedComboBox<E extends CheckableItem> extends JComboBox<E>{
private boolean keepOpen;
private transient ActionListener listener;

protected CheckedComboBox(){
    super();
}

protected CheckedComboBox(ComboBoxModel<E> aModel) {
    super(aModel);
}

protected CheckedComboBox(E[] m){
    super(m);
}

@Override public Dimension getPreferredSize(){
    return new Dimension(100,20);
}

@Override public void updateUI(){
    setRenderer(null);
    removeActionListener(listener);
    super.updateUI();
    listener = e->{
        if(e.getModifiers() == InputEvent.BUTTON1_MASK){
            updateItem(getSelectedIndex());
            keepOpen = true;
        }
    };

    setRenderer(new CheckBoxCellRenderer());
    addActionListener(listener);
    getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,0),"checkbox-select");
    getActionMap().put("checkbox-select",new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            Accessible a = getAccessibleContext().getAccessibleChild(0);
            if(a instanceof BasicComboPopup){
                BasicComboPopup pop = (BasicComboPopup) a;
                updateItem(pop.getList().getSelectedIndex());
            }
        }
    });
}

private void updateItem(int index) {
    if (isPopupVisible()) {
      E item = getItemAt(index);
      item.selected ^= true;
      removeItemAt(index);
      insertItemAt(item, index);
      setSelectedItem(item);
    }
  }

 @Override public void setPopupVisible(boolean v) {
        if (keepOpen) {
            keepOpen = false;
        } else {
            super.setPopupVisible(v);
        }
    }
}

class CheckBoxCellRenderer<E extends CheckableItem> implements ListCellRenderer<E> {
private final JLabel label = new JLabel(" ");
private final JCheckBox check = new JCheckBox(" ");
@Override public Component getListCellRendererComponent(JList list, CheckableItem value, int index, boolean isSelected, boolean cellHasFocus) {
    if (index < 0) {
        label.setText(getCheckedItemString(list.getModel()));
        return label;
    } else {
        check.setText(Objects.toString(value, ""));
        check.setSelected(value.selected);
        if (isSelected) {
            check.setBackground(list.getSelectionBackground());
            check.setForeground(list.getSelectionForeground());
        } else {
            check.setBackground(list.getBackground());
            check.setForeground(list.getForeground());
        }
        return check;
    }
}
private static String getCheckedItemString(ListModel model) {
    List<String> sl = new ArrayList<>();
    for (int i = 0; i < model.getSize(); i++) {
        Object o = model.getElementAt(i);
        if (o instanceof CheckableItem && ((CheckableItem) o).selected) {
            sl.add(o.toString());
        }
    }
    return sl.stream().sorted().collect(Collectors.joining(", "));
}
}

class CheckableItem {
public final String text;
public boolean selected;
protected CheckableItem(String text, boolean selected) {
    this.text = text;
    this.selected = selected;
}
@Override public String toString() {
    return text;
}
}

2 个答案:

答案 0 :(得分:0)

我认为这就是您正在寻找的,如果不是善意分享您正在尝试解决的确切问题

 if (index < 0) {
            label.setText(getCheckedItemString(list.getModel()));
            System.out.println(getCheckedItemString(list.getModel()));
            return label;
        } 

答案 1 :(得分:0)

我尝试了japura插件,它解决了我的问题。这是迄今为止的代码:

List<String> sizes = new ArrayList<>();
    sizes.add("2T/3T");
    sizes.add("4T");
    sizes.add("5T");
    sizes.add("4");
    sizes.add("6");
    sizes.add("8");
    sizes.add("10");

    CheckComboBox cmbSizes = new CheckComboBox();
    ListCheckModel model = cmbSizes.getModel();
    cmbSizes.setTextFor(CheckComboBox.NONE, "*Please select size*");
    //cmbSizes.setTextFor(CheckComboBox.MULTIPLE,String.valueOf(model.getCheckeds()));
    for(String size:sizes){
        model.addElement(size);
    }
    model.addListCheckListener(new ListCheckListener() {

        @Override
        public void removeCheck(ListEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void addCheck(ListEvent arg0) {
            System.out.println(String.valueOf(model.getCheckeds()));

        }
    });