Как снять флажок JCheckBox, который я использую в качестве одного из столбцов заголовков?

Мой столбец заголовка JCheckBox "отметить все" работает в том смысле, что если я устанавливаю флажок, все флажки в этом столбце становятся отмеченными. Я хочу сделать так, чтобы, если вы установите флажок в заголовке флажка, чтобы все поля в столбце стали отмеченными, снимите один из флажков в столбце после того, как снимите флажок в заголовке флажка.

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




}

}

этот вопрос решился. Пожалуйста, перейдите по этой ссылке, чтобы найти решение.

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


person AMVPlusPlus    schedule 17.10.2018    source источник
comment
Я попытался прикрепить к таблице совершенно новый модуль рендеринга заголовков, надеясь, что он снова снимет отметку, но этого не произошло, когда я снял отметку с ячеек в столбце.   -  person AMVPlusPlus    schedule 17.10.2018
comment
Чтобы быстрее получить помощь, опубликуйте минимально воспроизводимый пример или Короткий, автономный, правильный пример.   -  person Andrew Thompson    schedule 17.10.2018


Ответы (1)


Я хочу сделать так, чтобы, если вы установите флажок в заголовке флажка, чтобы все поля в столбце стали отмеченными, снимите один из флажков в столбце после того, как снимите флажок в заголовке флажка.

Добавьте TableModelListener к TableModel.

Когда TableModelEvent генерируется, вы можете проверить, были ли изменены данные в вашем столбце, содержащем флажок, а затем при необходимости сбросить флажок заголовка.

Посмотрите: JTable -> TableModeListener для простого примера использования TableModelListener.

person camickr    schedule 17.10.2018
comment
В том-то и дело, что я не знаю, как автоматически сбросить флажок заголовка. Как я могу превратить событие щелчка мышью, которое изменяет состояние флажка моего заголовка, в функцию, которая делает это без щелчка мышью. Я пробовал много способов и пока нашел одно близкое решение, которое заключается в том, чтобы вернуть заголовок к средству рендеринга по умолчанию, а затем обратно к моему средству рендеринга флажков, но проблема в том, что он не меняется сразу, и есть задержка. - person AMVPlusPlus; 18.10.2018
comment
@AMVPlusPlus, вы вызываете метод doClick(). Я понятия не имею, что это делает, но мне кажется, что это место для начала. Опубликуйте правильный минимально воспроизводимый пример, демонстрирующий проблему. То есть создайте таблицу с жестко закодированными данными, используя DefaultTableModel. Единственным пользовательским кодом должна быть логика рендеринга заголовков. - person camickr; 18.10.2018
comment
Я просто смотрел на вызов метода doClick(), но я только что понял, что часть рисования происходит здесь ((JTableHeader)e.getSource()).repaint(); с этой строкой, поэтому это означает, что даже если я вызову doclick, мне нужно настроить таргетинг на местоположение заголовка. Я создал глобальную переменную TableHeader и присвоил ей (JTableHeader)e.getSource(), думая, что могу сохранить местоположение, но пока ничего. Я не могу поверить, что что-то подобное уже не решено, хотя кажется, что оно было бы решено, поэтому я думаю, хорошо иметь это здесь сейчас. - person AMVPlusPlus; 18.10.2018
comment
@AMVPlusPlus, приведенный выше комментарий не добавляет полезной информации к вопросу. Мы все еще ждем минимально воспроизводимый пример. - person camickr; 18.10.2018