Search code examples
javaswingjtablejcheckboxjtableheader

How do I uncheck a JCheckBox that I am using as one of my header columns?


My JCheckBox "check all" header column works in that if I check the box, all checkboxes in this column become checked. I want to make it so that if you check the checkbox header so that all the boxes in the column become checked, uncheck one of the checkboxes in the column after will uncheck the checkbox header.

public class TablePanel extends javax.swing.JPanel {

public TablePanel() {
        initComponents();
        populateStringArrays(); //populate string arrays that will populate my table
        table.setModel(tableModel);
        table.getTableHeader().setReorderingAllowed(false);
        setWidthOfTable();
        loadTable(); //loads table with my array
        table.getColumnModel().getColumn(5).setHeaderRenderer(new BoxRenderer(new MyItemListener()));    
}


public class BoxRenderer extends JCheckBox implements TableCellRenderer, MouseListener{

        String columnTitle = "Rings";
        protected BoxRenderer rendererComponent;
        int column;
        boolean mousePressed = false;

        public BoxRenderer(ItemListener listener){
            rendererComponent = this;
            rendererComponent.addItemListener(listener);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
           if(table != null){
                JTableHeader header = table.getTableHeader();
                if(header != null){       
                        rendererComponent.setForeground(header.getForeground());
        rendererComponent.setBackground(header.getBackground());
                            rendererComponent.setFont(header.getFont());
                            Border border = header.getBorder();

        header.setBorder(BorderFactory.createRaisedBevelBorder());
                       rendererComponent.setHorizontalTextPosition(SwingConstants.LEADING); 
                            rendererComponent.setHorizontalAlignment(CENTER);  
                            header.addMouseListener(rendererComponent);
                    }
               }
               setColumn(column);
               rendererComponent.setText(columnTitle);
           return rendererComponent;
        }

        protected void setColumn(int column) {
            this.column = column;
        }

        public int getColumn() {
            return column;
        }

        protected void handleClickEvent(MouseEvent e) {
            if (mousePressed) {
                mousePressed=false;
                JTableHeader header = (JTableHeader)(e.getSource());
                JTable tableView = header.getTable();
                TableColumnModel columnModel = tableView.getColumnModel();
                int viewColumn = columnModel.getColumnIndexAtX(e.getX());
                int column = tableView.convertColumnIndexToModel(viewColumn);

                if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) {

                    doClick();
                }
            }
        }
        public void mouseClicked(MouseEvent e) {
            ((JTableHeader)e.getSource()).repaint();
        }

        public void mousePressed(MouseEvent e) {
            mousePressed = true;
        }

        public void mouseReleased(MouseEvent e) {

        }

        public void mouseEntered(MouseEvent e) {

        }

        public void mouseExited(MouseEvent e) {

        }



}

class MyItemListener implements ItemListener{

        @Override
        public void itemStateChanged(ItemEvent e) {

                Object source = e.getSource();

                if (source instanceof AbstractButton == false){
                    return;}

                boolean checked = e.getStateChange() == ItemEvent.SELECTED;
                System.out.println("Boolean checked = " + checked);

                if(checked == true){
                    checkAll();
                }else{
                    uncheckAll();
                }


        }

 }

private void checkAll(){

        for(int i=0; i<tableRecordArrayList.size(); i++){    

            table.getModel().setValueAt(true, i, 5);


        }

}

private void uncheckAll(){

        for(int i=0; i<tableRecordArrayList.size(); i++){ 
            table.getModel().setValueAt(false, i, 5);
        }

}

class TableModel extends javax.swing.table.AbstractTableModel{


        /**Constructor**/

        @Override
        public int getRowCount() {
            return tableRecordArrayList.size();
        }

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

        /**refresh for changes**/
        public void refreshTable(){
            fireTableDataChanged();
        }

        @Override
        public Object getValueAt(int row, int column) {
            TableRecord record = tableRecordArrayList.get(row);
            switch(column){

                case 0:
                    return record.firstName;
                case 1:
                    return record.middleName;
                case 2:
                    return record.lastName;
                case 3:
                    return record.age;
                case 4:
                    return record.height;
                case 5:
                    return record.ring;

            }

            return "N/A";
        }

        @Override
        public String getColumnName(int column){

            /**set the title of the columns of the table**/
            switch(column){

                case 0:
                    return "First Name";
                case 1:
                    return "Middle Name";
                case 2:
                    return "Last Name";
                case 3:
                    return "Age";
                case 4:
                    return "Height(cm)";
                case 5:
                    return "Has Championship Ring";

            }

            return "N/A";

        }

        /**turn column into checkboxes**/
        @Override
        public Class<?> getColumnClass(int column){
            if(column == 5){
                return Boolean.class;
            }
            return String.class;
        }


        @Override
        public boolean isCellEditable(int row, int column){
            return column == 5;
        }

        @Override
        public void setValueAt(Object avalue, int row, int column){
            TableRecord record;
            Boolean v;
            switch(column){
                case 5:
                record = tableRecordArrayList.get(row);
                v = (Boolean) avalue;
                record.ring = v;
                fireTableCellUpdated(row,1);
                printArrayList();
                fireTableDataChanged();
                break;
            }
        }




}

}

this question has been solved. Please visit this link to find the solution.

https://coderanch.com/t/700630/java/uncheck-JCheckBox-header-columns#3288215


Solution

  • I want to make it so that if you check the checkbox header so that all the boxes in the column become checked, uncheck one of the checkboxes in the column after will uncheck the checkbox header.

    Add a TableModelListener to the TableModel.

    When the TableModelEvent is generated you can check if the data was changed in your column containing the checkbox and then reset the header checkbox when required.

    Check out: JTable -> TableModeListener for a basic example of using a TableModelListener.