#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()));
}
});