如何在Java Swing中创建带有复选框的列表?

Sha*_*baz 30 java swing jcheckbox

在Java Swing中,每个项目列表都有一个复选框的最佳方法是什么?

即一个JList,其中包含一些文本和每个复选框的项目?

Dan*_*ark 21

这是一个很好的答案CheckBoxList.它实现了Telcontar的答案(虽然3年前:):我在Java 1.6中使用它没有任何问题.我还添加了一个addCheckbox这样的方法(肯定可以更短,一段时间没用过Java):

public void addCheckbox(JCheckBox checkBox) {
    ListModel currentList = this.getModel();
    JCheckBox[] newList = new JCheckBox[currentList.getSize() + 1];
    for (int i = 0; i < currentList.getSize(); i++) {
        newList[i] = (JCheckBox) currentList.getElementAt(i);
    }
    newList[newList.length - 1] = checkBox;
    setListData(newList);
}
Run Code Online (Sandbox Code Playgroud)

我尝试了Jidesoft的演示,玩弄了CheckBoxList我遇到的一些问题(行为不起作用).如果我发现CheckBoxList我链接的问题,我会修改这个答案.


Tel*_*tar 16

创建自定义ListCellRenderer并将其设置为JList.

此自定义ListCellRenderer必须JCheckboxgetListCellRendererComponent(...)方法的实现中返回.

但是这是JCheckbox不可编辑的,如果JCheckbox必须"勾选"或者不勾选,屏幕上的简单画面由您决定

例如,在选择行(参数isSelected)时显示它,但是这样,如果选择更改,则检查状态将不会被保留.最好显示它检查下面的数据ListModel,但是接下来由您来实现更改数据检查状态的方法,并通知更改JList要重新绘制.

如果您需要,我会稍后发布示例代码

ListCellRenderer


nin*_*ded 11

我可能正在寻找使用JTable而不是JList,因为复选框的默认呈现相当丑陋,我可能会想要使用自定义TableModel,CellRendererCellEditor来表示一个布尔值.当然,我想这已经完成了数百次.Sun有很好的例子.


Ren*_*ink 11

只需实现一个 ListCellRenderer

public class CheckboxListCellRenderer extends JCheckBox implements ListCellRenderer {

    public Component getListCellRendererComponent(JList list, Object value, int index, 
            boolean isSelected, boolean cellHasFocus) {

        setComponentOrientation(list.getComponentOrientation());
        setFont(list.getFont());
        setBackground(list.getBackground());
        setForeground(list.getForeground());
        setSelected(isSelected);
        setEnabled(list.isEnabled());

        setText(value == null ? "" : value.toString());  

        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

并设置渲染器

JList list = new JList();
list.setCellRenderer(new CheckboxListCellRenderer());
Run Code Online (Sandbox Code Playgroud)

这将导致

CheckboxListCellRenderer示例

Custom swing组件渲染器的详细信息.

PS:如果你想无线电元件只需更换extends JCheckboxextends JRadioButton.

  • 我只能使用 ctrl 选择多个复选框。这是预期的吗?我想像普通复选框一样自由选择任意数量。谢谢。 (2认同)

Raw*_*awa 6

更好的Java 7及更新版解决方案

我偶然发现了这个问题,并意识到一些答案已经很老了,已经过时了.如今,JList是通用的,因此有更好的解决方案.

我的通用JCheckBoxList的解决方案:

import java.awt.Component;

import javax.swing.*;
import javax.swing.border.*;

import java.awt.event.*;

@SuppressWarnings("serial")
public class JCheckBoxList extends JList<JCheckBox> {
  protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

  public JCheckBoxList() {
    setCellRenderer(new CellRenderer());
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        int index = locationToIndex(e.getPoint());
        if (index != -1) {
          JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index);
          checkbox.setSelected(!checkbox.isSelected());
          repaint();
        }
      }
    });
    setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  }

  public JCheckBoxList(ListModel<JCheckBox> model){
    this();
    setModel(model);
  }

  protected class CellRenderer implements ListCellRenderer<JCheckBox> {
    public Component getListCellRendererComponent(
        JList<? extends JCheckBox> list, JCheckBox value, int index,
        boolean isSelected, boolean cellHasFocus) {
      JCheckBox checkbox = value;

      //Drawing checkbox, change the appearance here
      checkbox.setBackground(isSelected ? getSelectionBackground()
          : getBackground());
      checkbox.setForeground(isSelected ? getSelectionForeground()
          : getForeground());
      checkbox.setEnabled(isEnabled());
      checkbox.setFont(getFont());
      checkbox.setFocusPainted(false);
      checkbox.setBorderPainted(true);
      checkbox.setBorder(isSelected ? UIManager
          .getBorder("List.focusCellHighlightBorder") : noFocusBorder);
      return checkbox;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

要动态添加JCheckBox列表,您需要创建自己的ListModel或添加DefaultListModel.

DefaultListModel<JCheckBox> model = new DefaultListModel<JCheckBox>();
JCheckBoxList checkBoxList = new JCheckBoxList(model);
Run Code Online (Sandbox Code Playgroud)

DefaultListModel是通用的,因此你可以使用Java指定的7 API方法在这里是这样的:

model.addElement(new JCheckBox("Checkbox1"));
model.addElement(new JCheckBox("Checkbox2"));
model.addElement(new JCheckBox("Checkbox3"));
Run Code Online (Sandbox Code Playgroud)