如何实现复选框列表java

可能是一个菜鸟问题,但我是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文件中实现它。 我尝试了很多代码,但他们从未展示过一个例子。 只是

要使用该类,只需实例化它,然后通过调用setListData传递一个JCheckBox对象(或JCheckBox对象的子类)的数组

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

你能告诉我怎么样吗?

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

图片

 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 rowList; private Set checked = new TreeSet(); public CheckModel(int rows) { this.rows = rows; rowList = new ArrayList(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; } } } 

代码期待一个JCheckBox对象列表 – 所以这是有效的

 CheckBoxList cbList = new CheckBoxList(); // the class you have JCheckBox check1 = new JCheckBox("One"); JCheckBox check2 = new JCheckBox("two"); JCheckBox[] myList = { check1, check2}; list of checkbox object cbList.setListData(myList); // set the list data for the object 

小Swing程序使用下面的课程

  util; import javax.swing.*; public class HelloWorldSwing { private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("HelloWorldSwing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); CheckBoxList cbList = new CheckBoxList(); JCheckBox check1 = new JCheckBox("One"); JCheckBox check2 = new JCheckBox("two"); JCheckBox[] myList = { check1, check2}; cbList.setListData(myList); frame.getContentPane().add(cbList); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } 

}

Interesting Posts