【问题标题】:setValueAt for check box value in JTable MultiarraysetValueAt 用于 JTable Multiarray 中的复选框值
【发布时间】:2018-10-10 16:24:43
【问题描述】:

我目前在将值设置为 JTable 中的复选框时遇到问题。 我需要将每个复选框的布尔值存储在表的行中。 我可以显示默认(假)复选框,但是一旦我单击复选框,就会出现异常; java.lang.ArrayIndexOutOfBoundsException:0。 我对带有布尔值的多数组不太熟悉,我似乎无法弄清楚我的代码的哪一部分是不正确的。

public static final int CHECKBOX= 0;
private final List<Data> datas;
private static boolean CHECKBOX_RENDERED[][] = new boolean[][]{};
private static Arrays array = null;

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    if (rowIndex >= this.datas.size()) {
        return null;
    }

    Data theData= this.datas.get(rowIndex);
    if (theData== null) {
        return null;
    }

    //Initialize the boolean field with table dimension
    CHECKBOX_RENDERED = new boolean[datas.size()][columnIndex];

    switch(columnIndex) {
    case CHECKBOX:
        array.fill(CHECKBOX_RENDERED[rowIndex], false);
        return false; //default
    default:
        throw new IllegalArgumentException("Invalid column index");
    }
}


@Override
public void setValueAt(Object value, int row, int column) {
    if (column == CHECKBOX) {
        Data data= this.datas.get(row);
        if (data!= null && value instanceof Boolean) {

            if (CHECKBOX_RENDERED[row][column]) {
                CHECKBOX_RENDERED[row][column] = false;
            } else {
                CHECKBOX_RENDERED[row][column] = true;
            }

            fireTableCellUpdated(row, column);
        }
    }
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 有了 camickr 的回答,我能够找到其他地方来更正我的代码并解决了这个问题。我移动了 CHECKBOX_RENDERED = new boolean[datas.size()][columnIndex];在加载数据的行之后。我完全删除了数组字段并返回 CHECKBOX_RENDERED[rowIndex][columnIndex];在switch语句的checkbox的情况下。
  • ...after the line where data is loaded. - 这个代码甚至没有包含在问题中。这就是为什么您被要求在每个问题上都发布适当的“MCVE/SSCCE”。

标签: java swing multidimensional-array checkbox jtable


【解决方案1】:
private static boolean CHECKBOX_RENDERED[][] = new boolean[][]{};

您定义了一个二维数组变量,但您从未真正定义数组的行和列的大小。因此,数组的大小为 (0, 0),您不能在数组中添加/更改任何数据。

不要创建你自己的表模型。

最简单的解决方案是使用DefaultTableModel。它将为您管理数据。您只需要在表格中定义所需的行数/列数,其余部分会自动为您管理。

或者如果您不知道需要多少行数据,那么您可以使用addRows(...) 方法根据需要动态添加行。

【讨论】:

  • 感谢您的快速回复。但是,我确实为字段 CHECKBOX_RENDERED = new boolean[datas.size()][columnIndex]; 定义了值在 getValueAt 方法中。
  • 我的问题是我填充了数组变量array.fill(CHECKBOX_RENDERED[rowIndex], false);以及如何在 setValueAt 方法中重置布尔值?
  • 您曾在哪里向“数据”列表添加项目?创建类时需要定义数组的大小。当您将逻辑添加到 getValueAt() 方法时,您将在每次调用该方法时重新创建数组!!!将 System.out.println(...) 语句添加到 getValueAt() 以查看调用此方法的次数。同样,我建议您在学习使用 JTable 的基础知识之前只使用 DefaultTableModel。
  • 是的,你说得很好。我不应该在 getValueAt() 中定义值。
  • @In-youngChoung 它解决了这个问题的问题。这不是20个问题。您花时间了解建议并进行自己的修复。我们不是来调试每一行代码的。如果您需要提高调试技能,这是基本的问题解决方案。诸如将 System.out.println(...) 语句添加到代码中以查看发生了什么的事情。使用 DefaultTableModel 的建议将解决您的所有问题。
猜你喜欢
  • 2014-04-29
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2013-08-01
  • 2015-11-26
相关资源
最近更新 更多