在Java Swing中,每个项目列表都有一个复选框的最佳方法是什么?
即一个JList,其中包含一些文本和每个复选框的项目?
这是一个很好的答案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
我链接的问题,我会修改这个答案.
创建自定义ListCellRenderer
并将其设置为JList
.
此自定义ListCellRenderer
必须JCheckbox
在getListCellRendererComponent(...)
方法的实现中返回.
但是这是JCheckbox
不可编辑的,如果JCheckbox
必须"勾选"或者不勾选,屏幕上的简单画面由您决定
例如,在选择行(参数isSelected
)时显示它,但是这样,如果选择更改,则检查状态将不会被保留.最好显示它检查下面的数据ListModel
,但是接下来由您来实现更改数据检查状态的方法,并通知更改JList
要重新绘制.
如果您需要,我会稍后发布示例代码
ListCellRenderer
我可能正在寻找使用JTable而不是JList,因为复选框的默认呈现相当丑陋,我可能会想要使用自定义TableModel,CellRenderer和CellEditor来表示一个布尔值.当然,我想这已经完成了数百次.Sun有很好的例子.
只需实现一个 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; } }
并设置渲染器
JList list = new JList(); list.setCellRenderer(new CheckboxListCellRenderer());
这将导致
Custom swing组件渲染器的详细信息.
PS:如果你想无线电元件只需更换extends JCheckbox
用extends JRadioButton
.
我偶然发现了这个问题,并意识到一些答案已经很老了,已经过时了.如今,JList是通用的,因此有更好的解决方案.
我的通用JCheckBoxList的解决方案:
import java.awt.Component; import javax.swing.*; import javax.swing.border.*; import java.awt.event.*; @SuppressWarnings("serial") public class JCheckBoxList extends JList{ 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 model){ this(); setModel(model); } protected class CellRenderer implements ListCellRenderer { 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; } } }
要动态添加JCheckBox列表,您需要创建自己的ListModel或添加DefaultListModel.
DefaultListModelmodel = new DefaultListModel (); JCheckBoxList checkBoxList = new JCheckBoxList(model);
该DefaultListModel是通用的,因此你可以使用Java指定的7 API方法在这里是这样的:
model.addElement(new JCheckBox("Checkbox1")); model.addElement(new JCheckBox("Checkbox2")); model.addElement(new JCheckBox("Checkbox3"));