如何在Java Swing中使用复选框列出列表?

时间:2020-03-05 18:41:28  来源:igfitidea点击:

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

IE。一个JList,其中每个项目都有一些文本和一个复选框?

解决方案

回答

我可能希望使用JTable而不是JList,并且由于复选框的默认呈现非常丑陋,因此我可能希望放入自定义TableModel,CellRenderer和CellEditor以表示布尔值。当然,我想这已经做了无数次了。 Sun有很好的例子。

回答

创建一个自定义的ListCellRenderer并将其分配给JList。

这个自定义的ListCellRenderer必须在getListCellRendererComponent(...)方法的实现中返回JCheckbox。

但是这个" JCheckbox"将无法编辑,因为屏幕上的简单绘画取决于我们是否必须"勾选"这个" JCheckbox",

例如,在选中该行时将其选中(参数" isSelected"),但如果选择更改,则不会保留检查状态。最好将其显示为查阅ListModel下的数据进行检查,但是最好由我们来实现更改数据检查状态并将更改通知要重新绘制的JList的方法。

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

ListCellRenderer

回答

带有Java的好消息是有人已经实现了所需的小部件或者实用程序。大型OSS社区的部分好处。除非我们真的想自己做,否则无需重新发明轮子。在这种情况下,这对于CellRenderers和Editors是一个很好的学习练习。

我的项目在JIDE上取得了巨大的成功。所需的组件(复选框列表)位于JIDE通用层(它是OSS,位于java.net上)。商业化的东西也很好,但是我们不需要它。

http://www.jidesoft.com/products/oss.htm
https://jide-oss.dev.java.net/

回答

一个很好的答案是这个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);
}

我试用了Jidesoft的演示,在玩CheckBoxList时遇到了一些问题(行为不起作用)。如果我发现链接到的CheckBoxList有问题,我将修改此答案。