【问题标题】:Java TableModel not updating?Java TableModel 没有更新?
【发布时间】:2017-09-23 01:27:59
【问题描述】:

更新

我通过@MadProgrammer 找到了这个答案,它奏效了!

Updating JTable on button click

基本上,您向 TableModel 添加一个 refresh() 方法,该方法接收更新的对象。然后,每次按下按钮时,都会调用 tablemodel 的这个方法。

我假设您也可以扩展 JTable 并将此方法放在扩展类中。 可能有更有效的解决方案,但我现在会坚持这个。 谢谢!

/**************************************************** ******************************/

我正在用 java 制作表格来显示类“DinnerTable”中的对象的值。我构建了一个自定义的 DinnerTableModel 类,而不是扩展 AbstractTableModel 并实现 TableModel。但是,我似乎在修改我原来的“DinnerTable”对象时,tableModel 中的相应对象根本没有改变。我用谷歌搜索的这个问题的解决方案是创建一个 TableModelListener。但是,我还有另一个 JTable,它没有这个监听器,但它工作得很好。这些表之间的主要区别在于,导致这些对象的值发生变化的 JButton 与工作表是同一个选项卡,但与 JTabbedPane 中的非工作 DinnerTable 位于不同的选项卡上。更新这些 DinnerTableModel 的有效方法是什么? (我需要 38 个)。谢谢!

package DinnerList;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class DinnerTableModel extends AbstractTableModel implements TableModel{

private final String[] columnNames;
private DinnerTable dt;

public DinnerTableModel(DinnerTable popopo)
{
    dt=popopo;
    columnNames= new String[1];
    columnNames[0]=popopo.getTableNumber()+". "+popopo.getTeacherName();
}

 public String getColumnName(int col) 
{
        return columnNames[0];
}
public Object getValueAt(int rowIndex, int colIndex)
{
    if(rowIndex<7)
    {
        System.out.println(dt.getMembers().size());
        if(dt.getMembers().size()>rowIndex)
        {
            System.out.println("haha");
            return dt.getMembers().get(rowIndex);
        }
        else
        {
            return null;
        }
    }
    else
    {
        System.out.println("Error: attempting to getValue at row>=7 in DTM");
        return null;
    }
}


public Class getColumnClass(int c) 
{
    return Student.class;
}
public boolean isCellEditable(int row, int col) 
{
    return true;
}

public void setValueAt(Object b,int row, int col)
{
    if(b instanceof Student)
    {
        dt.getMembers().set(row, (Student)b);
    }
    else
    {
        System.out.println("Error: Attemping to put nonstudent into student in DTM");
    }
    fireTableCellUpdated(row, col);
}

}

//////////////////////////////

package DinnerList;

import java.util.ArrayList;
import java.util.List;

public class DinnerTable 
{
private List<Student> members= new ArrayList<Student>(7);
private int tableNumber=0;
private int capacity=0;
private String teacherName="";
private boolean available=true;

public DinnerTable(int a, int b, String c, boolean d)
{
    tableNumber=a;
    capacity=b;
    teacherName=c;
    available=d;
}


public void add(Student s)
{
    if(available&&(members.size()<capacity))
    { this.members.add(s); }
    else if(!available)
    { System.out.println("Adding Student failed, table "+tableNumber+" not available");}
    else
    { System.out.println("Adding Student failed, table "+tableNumber+" is full");}
}


public List<Student> getMembers(){return members;}
public void remove(Student s) 
{
    if(members.contains(s))
    {
        members.remove(s);
    }
    else
    {
        System.out.println("Failed to remove student from table because it wasn't there");
    }
}
}

///////////

【问题讨论】:

  • 您没有发布有效的minimal reproducible example,即为我们编译和运行的代码。如果您需要体面的帮助,请通过创建和发布此问题来改进此问题。是的,这要求你做额外的工作,但你要求我们做额外的工作,而且是免费的,所以我认为这是一个公平的要求。

标签: java swing jtable event-listener tablemodel


【解决方案1】:

TableModel 应该存储数据。然后,当数据更改时,您调用 AbstractTableModel 的适当 fireXXX(...) 方法来告诉表重新绘制自己。

然后通过 TableModel 对数据进行更改,TableModel 将更新您的自定义对象。

这基本上意味着 DinnerTable 类数据结构应该是 DinnerTableModel 的一部分,而不是一个单独的类。

有关为自定义对象创建自定义 TableModel 的分步指南,请参阅 Row Table Model

【讨论】:

  • 感谢您的回复。但是,如果直接点击表格没有改变TabelModel数据,而是从不同的选项卡按下JButton,它仍然可以工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多