gpt4 book ai didi

java - java实现复选框列表的方法

转载 作者:行者123 更新时间:2023-12-01 17:16:58 28 4
gpt4 key购买 nike

可能是一个菜鸟问题,但我对java很陌生。我需要一个复选框列表,我发现 Swing 不支持该列表,但我在这里找到了这个自定义控件

http://www.devx.com/tips/Tip/5342

因此,我创建了一个名为 CheckBoxList 的类文件,并将链接中的代码复制到其中:

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;

public class CheckBoxList extends JList
{
protected static Border noFocusBorder =
new EmptyBorder(1, 1, 1, 1);

public CheckBoxList()
{
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);
}

protected class CellRenderer implements ListCellRenderer
{
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus)
{
JCheckBox checkbox = (JCheckBox) value;
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;
}
}
}

问题是我不知道如何在我的 GUI 文件中实现它。我尝试了很多代码,但他们从未展示过示例。只是

To use the class, simply instantiate it, then pass it an array of JCheckBox objects (or subclasses of JCheckBox objects) by calling setListData

这是否意味着我不会在图形设计 View 中看到该控件?我的客户希望能够自己编辑它并添加内容,因此我希望它尽可能简单且图形化。如果有人可以展示实例化它的示例或给出很好的提示,我将不胜感激。谢谢!

最佳答案

Can you just tell me how?

使用一列JTable和适当的renderer and editor 。基于此example ,下面的代码依赖于 Boolean.Class 类型的数据值的默认渲染器。引用了一个更一般的例子 here .

image

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

/** @see https://stackoverflow.com/a/13919878/230513 */
public class CheckTable {

private static final CheckModel model = new CheckModel(5000);
private static final JTable table = new JTable(model) {

@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(150, 300);
}

@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
JCheckBox jcb = (JCheckBox) super.prepareRenderer(renderer, row, column);
jcb.setHorizontalTextPosition(JCheckBox.LEADING);
jcb.setText(String.valueOf(row));
return jcb;
}
};

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
JFrame f = new JFrame("CheckTable");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(1, 0));
f.add(new JScrollPane(table));
f.add(new DisplayPanel(model));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}

private static class DisplayPanel extends JPanel {

private DefaultListModel dlm = new DefaultListModel();
private JList list = new JList(dlm);

public DisplayPanel(final CheckModel model) {
super(new GridLayout());
this.setBorder(BorderFactory.createTitledBorder("Checked"));
this.add(new JScrollPane(list));
model.addTableModelListener(new TableModelListener() {

@Override
public void tableChanged(TableModelEvent e) {
dlm.removeAllElements();
for (Integer integer : model.checked) {
dlm.addElement(integer);
}
}
});
}
}

private static class CheckModel extends AbstractTableModel {

private final int rows;
private List<Boolean> rowList;
private Set<Integer> checked = new TreeSet<Integer>();

public CheckModel(int rows) {
this.rows = rows;
rowList = new ArrayList<Boolean>(rows);
for (int i = 0; i < rows; i++) {
rowList.add(Boolean.FALSE);
}
}

@Override
public int getRowCount() {
return rows;
}

@Override
public int getColumnCount() {
return 1;
}

@Override
public String getColumnName(int col) {
return "Column " + col;
}

@Override
public Object getValueAt(int row, int col) {
return rowList.get(row);
}

@Override
public void setValueAt(Object aValue, int row, int col) {
boolean b = (Boolean) aValue;
rowList.set(row, b);
if (b) {
checked.add(row);
} else {
checked.remove(row);
}
fireTableRowsUpdated(row, row);
}

@Override
public Class<?> getColumnClass(int col) {
return getValueAt(0, col).getClass();
}

@Override
public boolean isCellEditable(int row, int col) {
return true;
}
}
}

关于java - java实现复选框列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358240/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com