gpt4 book ai didi

java - 使用 AbstractTableModel 从 JTable 选择表行时出错

转载 作者:行者123 更新时间:2023-12-01 16:35:11 25 4
gpt4 key购买 nike

我有一个类型模块的ArrayList,每个模块都有一个分配的数组列表。我已经编写了以下 TableModel,但是当在表中选择某些内容时,我遇到了问题,它导致我的 ArrayList 超出范围。这是我的 table 模型:

public class AssignmentsTableModel extends AbstractTableModel {
private ArrayList<Module> modules;
private static final String[] COLUMN_NAMES = {"Module Identifier", "Module Name", "Assignment Title", "Author", "Date Set", "Date Due", "Weighting"};

private int moduleID;
private int assignmentID;
private Module module;
private int totalNumberAssignments;

public AssignmentsTableModel(ArrayList<Module> modules) {
moduleID = 0;
assignmentID = 0;
this.modules = modules;
module = modules.get(moduleID);
totalNumberAssignments = getRowCount();
}

public AssignmentsTableModel(Module module) {
modules = new ArrayList<Module>();
modules.add(module);
}

@Override
public int getRowCount() {
int rowCount = 0;
for(Module mod : modules){
rowCount += mod.getAssignments().size();
}
return rowCount;
}

@Override
public int getColumnCount() {
return COLUMN_NAMES.length; //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public Object getValueAt(int row, int column) {
if(column%getColumnCount() == 0 && getRowCount() <= totalNumberAssignments){
if(isAtLastAssignment(row, moduleID)){
assignmentID = 0;
moduleID += 1;
}
}

module = modules.get(moduleID);
ArrayList<Assignment> assignments = module.getAssignments();

Assignment assignment = assignments.get(assignmentID);

switch (column){
case 0: return module.getIdentifier();
case 1: return module.getTitle();
case 2: return assignment.getTitle();
case 3: return assignment.getAuthor();
case 4: return assignment.getSet();
case 5: return assignment.getDue();
case 6: return assignment.getWeighting();
default: return null;
}


}

public String getColumnName(int columnIndex) {
return COLUMN_NAMES[columnIndex];
}

public boolean isAtLastAssignment(int row, int moduleID){
boolean atLast = false;
ArrayList<Assignment> assignments = modules.get(moduleID).getAssignments();
if(moduleID == 0){
if(row == assignments.size()){
atLast = true;
}
} else {
int assignmentsSize = assignments.size() + getCurrentRowNumber(moduleID);
if(row == assignmentsSize){
atLast = true;
}
}

return atLast;
}

public int getCurrentRowNumber(int moduleID){
int rowNumber = 0;

for(int i = 0; i < moduleID; i++){
rowNumber = modules.get(i).getAssignments().size()-1;
}

return rowNumber;
}
}

正如你所看到的,我将 moduleID 存储为全局变量,这在第一次启动时很好,但是一旦选择了某些内容,它就会使用最后的值。我还能做什么来阻止这种情况发生?

最佳答案

TableModel 方法 getValueAt()每次表渲染器想要获取单元格的值以便渲染它时都会调用它。它与您单击表格行并让表格将该行标记为选定状态没有(直接或可靠)相关。

换句话说,您不希望由于调用 getValueAt() 方法而改变表模型的状态。

如果您的 getValueAt() 方法使用该行作为数组的索引,那将是最简单的。但是,看起来每个模块的行数是可变的。在这种情况下,如果您无法通过算法生成正确的索引,则可以在构造函数中“展平”一次数据,并简化查找代码。

也就是说,您的表模型包含:

private List<RowData> rowData

和一个包含行数据的内部类:

private static class RowData
{
private Moddule;
private Assignment assignment;

...
}

在你的构造函数中:

public AssignmentsTableModel(List<Module> modules)
{
this.rowData = new ArrayList<Module>();

for (Module module : modules)
{
for (Assignment assignment : module.getAssignments())
{
rowData.add(new RowData(module, assignment));
}
}
}

这简化了您的 getValueAt() 方法:

@Override
public Object getValueAt(int row, int column) {
final RowData row = this.rowData.get(row);

switch (column){
case 0: return row.getModule().getIdentifier();
case 1: return row.getModule().getTitle();
case 2: return row.getAssignment().getTitle();
case 3: return row.getAssignment().Author();
case 4: return row.getAssignment().getSet();
case 5: return row.getAssignment().getDue();
case 6: return row.getAssignment().getWeighting();
default: return null;
}
}

关于java - 使用 AbstractTableModel 从 JTable 选择表行时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9969381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com