2016-10-06 1 views
0

私はcheckedcomboboxコントロールをtutorialの後に作成しましたが、選択した値をコントロールから取得してコンソールに表示する方法がわかりません。これは、私が持っているコードスニペットです:Java 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 && ((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; 
} 
} 

答えて

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

     } 
    }); 
0

私は、これはあなたが探しているものだと思います、親切にあなたは、私が試してみました

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

私はコードを試してみます... – SilverRay

+0

itemListenerかactionlistenerですか? – SilverRay

+0

私はあなたのコードを試してみました。私はあなたのコードと組み合わせることはできません。あなたのコードを組み込む方法の詳細な構造を提供できますか? – SilverRay

関連する問題