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必须JCheckbox在getListCellRendererComponent(...)方法的实现中返回.
但是这是JCheckbox不可编辑的,如果JCheckbox必须"勾选"或者不勾选,屏幕上的简单画面由您决定
例如,在选择行(参数isSelected)时显示它,但是这样,如果选择更改,则检查状态将不会被保留.最好显示它检查下面的数据ListModel,但是接下来由您来实现更改数据检查状态的方法,并通知更改JList要重新绘制.
如果您需要,我会稍后发布示例代码
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)
这将导致

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<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)
| 归档时间: |
|
| 查看次数: |
73164 次 |
| 最近记录: |