How to implement checkbox list java

后端 未结 2 1247
情深已故
情深已故 2020-12-12 07:20

Probably a noob question, but im new to java. I have a need for a checkbox list which I found is not supported in swing, but I found this custom control here

http://

相关标签:
2条回答
  • 2020-12-12 07:38

    The code is expecting a list of JCheckBox objects - so this works

    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
    

    Small Swing program using your class below

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

    }

    0 讨论(0)
  • 2020-12-12 07:56

    Can you just tell me how?

    Use a one column JTable and an appropriate renderer and editor. Based on this example, the code below relies on the default renderer for a data value of type Boolean.Class. A more general example is cited 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;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题