2009-10-15 90 views
2

我想制作一个JComboBox,其中包含项目而不是文本的复选框。另外,应该可以检查多个项目并从组件中检索所选项目。我应该制作一个自定义的ComboBoxUI,ComboBoxEditor,ListCellRenderer,ComboPopUp或完全不同的东西吗?有没有一个现有的Java控件可以做到这一点?Java - JComboBox中的复选框

回答

5

这很容易实现。在这里找到link text

/* * The following code is adapted from Java Forums - JCheckBox in JComboBox URL: http://forum.java.sun.com/thread.jspa?forumID=257&threadID=364705 Date of Access: July 28 2005 */ 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.table.*; 
import java.util.*; 

public class JComboCheckBox extends JComboBox { 
    public JComboCheckBox() { addStuff(); } 
    public JComboCheckBox(JCheckBox[] items) { super(items); addStuff(); } 
    public JComboCheckBox(Vector items) { super(items); addStuff(); } 
    public JComboCheckBox(ComboBoxModel aModel) { super(aModel); addStuff(); } 
    private void addStuff() { 
    setRenderer(new ComboBoxRenderer()); 
    addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { itemSelected(); } 
    }); 
    } 
    private void itemSelected() { 
    if (getSelectedItem() instanceof JCheckBox) { 
     JCheckBox jcb = (JCheckBox)getSelectedItem(); 
     jcb.setSelected(!jcb.isSelected()); 
    } 
    } 
    class ComboBoxRenderer implements ListCellRenderer { 
    private JLabel defaultLabel; 
    public ComboBoxRenderer() { setOpaque(true); } 
    public Component getListCellRendererComponent(JList list, Object value, int index, 
       boolean isSelected, boolean cellHasFocus) { 
     if (value instanceof Component) { 
     Component c = (Component)value; 
     if (isSelected) { 
      c.setBackground(list.getSelectionBackground()); 
      c.setForeground(list.getSelectionForeground()); 
     } else { 
      c.setBackground(list.getBackground()); 
      c.setForeground(list.getForeground()); 
     } 
     return c; 
     } else { 
     if (defaultLabel==null) defaultLabel = new JLabel(value.toString()); 
     else defaultLabel.setText(value.toString()); 
     return defaultLabel; 
     } 
    } 
    } 
} 
+0

无法想象任何人都想要改变与comboModel一起选择的复选框 – kleopatra 2011-05-06 14:41:21

+0

我用你的例子来创建一个样本,并得到我们无法从按键上的下拉菜单中选择数据。 例如如果组合文本是第一,第二等。 \t用户按“S”键, \t第二个应该被突出显示/选择。就像在普通的JComboBox中一样。 \t有没有什么办法可以做到这一点,因为我们在我们的应用程序之一,我们需要它。 – sridhar 2015-05-26 10:46:15

1

这不是什么组合框是“为”。你确定你不想要,例如,与JRadioButtonMenuItem s的JMenu?

如果你真的想继续,那么你会使用自定义渲染器,因为你suggested

1

我们曾经给过这个相同的需求。我们遵守一个全新的组件。 它本质上是一个JPanel,它有一个文本字段和一个向下箭头按钮。它包含一个JList,它使用JCheckbox-派生的ListCellRenderer。该JList打包在一个JPopupMenu 这是显示在鼠标点击。

0

你可以看看japura。这是一个基于swing的开源自定义组件。