如何获取 jTable 中选中复选框的值并在 Java 中计算它们的平均值

问题描述

我正在尝试在 Java 中创建评级原型,用户是否可以通过单击复选框对方面进行评级。我正在尝试捕获表中选定复选框的值并计算它们的平均值。而且我希望用户能够在每一行中只选择一个复选框。

图片就明白我的意思

int rating;
int checkBox;
int average = 0;
        
for(int a=0; a<jTable1.getRowCount(); a++){
    Boolean isChecked = Boolean.valueOf(jTable1.getValueAt(a,+1).toString());
    if (isChecked) {
        rating =+1;
        //get the values of the columns you need.
    } else {
        System.out.printf("Row %s is not checked \n",a);
    }
    for(int c=1; c<jTable1.getColumnCount(); c++) {
        //if( jTable1.getValueAt(c,1).isSelected()==true){
              //rating = 1;
        //}
    }  
}

看这里的图片可以清楚地了解我在说什么:

https://i.stack.imgur.com/ioBw6.jpg

.. 可以总结为一个包含六列的表格,第一列标记为 Aspects(待评级),然后是标记为 1-5 的列,其中包含复选框。

解决方法

用户可以通过点击复选框来评价方面。

所以我首先创建一个方法来返回每一行的评分。类似的东西:

public int getRowRating(int row)
{
    if (int c = 1; c < table.getColumnCount())
    {
        if ((Boolean)getValueAt(row,c))
            return c;
    }

    //  no selection

    return 0;
}

然后您需要一个循环来获取每一行的评分并给出总分。类似的东西:

for (int r = 0; r < table.getRowCount(); r++)
{
    int rowRating = getRowRating(r);

    if (rowRating == 0)
        // no rating
    else
        rating += rowRating; 
}

我希望用户只能在每一行中选择一个复选框。

一种方法是创建自定义 TableModel 以在您在列中进行选择时取消选择其他列中的复选框。您可以覆盖 setValueAt(...) 方法。类似的东西:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableSingleSelection extends JPanel
{
    public TableSingleSelection()
    {
        String[] columnNames = {"Question","1","2","3"};
        Object[][] data =
        {
            {"Question 1",Boolean.TRUE,Boolean.FALSE,},{"Question 2",{"Question 3",}
        };

        DefaultTableModel model = new DefaultTableModel(data,columnNames)
        {
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class
            @Override
            public Class getColumnClass(int column)
            {
                return getValueAt(0,column).getClass();
            }

            @Override
            public void setValueAt(Object value,int row,int column)
            {
                super.setValueAt(value,row,column);

                if (column == 0) return;

                //  Reset all other columns to false

                for (int i = 1; i < getColumnCount(); i++)
                {
                    if (i != column)
                    {
                        super.setValueAt(Boolean.FALSE,i);
                    }
                }


            }
        };

        JTable table = new JTable( model );
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Table Model Listener");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TableSingleSelection());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}

注意:通过向 TableModel 添加选择/取消选择逻辑,如果用户使用鼠标或键盘更改复选框的选择,代码将起作用。用户界面应始终支持鼠标或键盘。

此外,通常您会使用 JRadioButton 来指示您只能进行一个选择,但这会使过程复杂化,因为您需要为 JRadioButton 创建自定义渲染器和编辑器。您可以在网站/网络上搜索有关如何执行此操作的示例。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...