Java получает значения CheckedComboBox

#java #jcombobox #jcheckbox

#java #jcombobox #jcheckbox

Вопрос:

Я создал элемент управления checkedcombobox, следуя этому руководству, но я не знаю, как извлечь выбранные значения из элемента управления и отобразить его в консоли. Это фрагмент кода, который у меня есть:

 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 amp;amp; ((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;
}
}
  

Ответ №1:

Я думаю, это то, что вы ищете, если не любезно поделитесь точной проблемой, которую вы пытаетесь исправить

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

Комментарии:

1. Это ItemListener или actionlistener?

2. Я попробовал ваш код, и я не могу объединить его со своим кодом. Можете ли вы предоставить более подробную структуру о том, как включить ваш код в мой?

3. @SilverRay, пожалуйста, поделитесь точным поведением, которое вам нужно, чтобы я мог внести соответствующие изменения в код

4. Я не могу получить значения выбранных элементов в checkedcombobox. Я добавляю весь код класса checkedcombobox, чтобы как-то помочь решить проблему

5. @SilverRay пожалуйста, найдите getListCellRendererComponent() класса CheckBoxCellRenderer и используйте приведенный выше код в первом предложении if

Ответ №2:

Я попробовал плагин 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()));

        }
    });