【问题标题】:How do I uncheck a JCheckBox that I am using as one of my header columns?如何取消选中用作标题列之一的 JCheckBox?
【发布时间】:2019-03-21 14:03:34
【问题描述】:

我的 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

【问题讨论】:

标签: java swing jtable jcheckbox jtableheader


【解决方案1】:

我想这样做,如果您选中复选框标题以使列中的所有框都被选中,取消选中列中的复选框之一将取消选中复选框标题。

TableModelListener 添加到TableModel

生成TableModelEvent 后,您可以检查包含复选框的列中的数据是否已更改,然后在需要时重置标题复选框。

查看:JTable -> TableModeListener,了解使用 TableModelListener 的基本示例。

【讨论】:

  • 就是这样,我不知道如何自动重置标题复选框。如何将更改标题复选框状态的鼠标单击事件转换为无需鼠标单击部分即可执行此操作的函数。到目前为止,我已经尝试了很多方法并找到了一种接近的解决方案,即将标题设置回默认渲染器,然后回到我的复选框渲染器,但问题是它不会立即更改并且存在延迟。
  • @AMVPlusPlus,您调用 doClick() 方法。我不知道那是做什么的,但在我看来那是开始的地方。发布一个正确的minimal reproducible example 来说明问题。那就是使用 DefaultTableModel 创建一个包含硬编码数据的表。唯一的自定义代码应该是您的标题渲染器逻辑。
  • 我只是在查看调用 doClick() 方法,但我刚刚意识到绘画部分发生在这里 ((JTableHeader)e.getSource()).repaint();有了这一行,这意味着即使我调用 doclick,我也需要定位标题位置。我创建了一个全局 TableHeader 变量并将其分配给 (JTableHeader)e.getSource() ,我认为我可以保存该位置,但目前还没有。我不敢相信没有像这样的事情已经得到解决,所以我想现在有这个很好。
  • @AMVPlusPlus,上面的评论没有为问题添加任何有用的信息。我们还在等待minimal reproducible example
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2016-12-02
相关资源
最近更新 更多