2009-10-15 44 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的開源自定義組件。