Java - JComboBox中的复选框

3

我想制作一个JComboBox,其中项目使用复选框而不是文本。此外,应该可以选择多个项目并从组件中检索所选项目。我应该制作自定义ComboBoxUI、ComboBoxEditor、ListCellRenderer、ComboPopUp还是完全不同的东西?是否有现有的Java控件可以实现这一点?

4个回答

8
这个实现起来相当容易。在这里找到了它 链接文本
/* * 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;
      }
    }
  }
}

无法想象有人想要更改选择框所选中的comboModel。 - kleopatra
我使用了你的例子创建了一个样本,发现我们无法在按键时从下拉列表中选择数据。 例如,如果组合文本是“First”,“Second”等... 用户按下“S”键, 应该突出显示/选择第二个。就像在普通的JComboBox中一样。 是否有任何方法可以像我的一个应用程序那样实现它? - sridhar

1

组合框并不是用来做这个的。您确定不想要一个带有 JRadioButtonMenuItem 的 JMenu 吗?

如果您确实想要继续,那么您需要使用自定义渲染器,就像您所 suggested 的那样。


1
我们曾经也被要求做过同样无聊的需求。我们使用了一个全新的组件。 它本质上是一个包含文本字段和向下箭头按钮的JPanel。它包含了一个使用JCheckbox派生的ListCellRendererJList。这个JList被打包在一个JPopupMenu中,在鼠标点击时显示。

0
你可以看一下japura。它是一个基于Swing的开源自定义组件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接