更新
我找到了@MadProgrammer的答案,它起了作用!
基本上,您可以将一个refresh()方法添加到接受更新对象的TableModel中。然后,每次按下按钮,就会调用这个表模型的方法。
我假设您也可以扩展JTable并将该方法放入扩展类中。也许有更有效的解决方案,但我会坚持这一个暂时。谢谢!
/****************************************************************************/
我正在用java制作表格,以显示类"DinnerTable“中对象的值。我构建了一个自定义的DinnerTableModel类,而不是扩展AbstractTableModel并实现TableModel。但是,当我修改原始的"DinnerTable“对象时,tableModel中的相应对象一点也不改变。我搜索到的这个问题的解决方案是创建一个TableModelListener。但是,我还有另一个JTable,它没有这个侦听器,但是它运行得很好。这些表之间的主要区别在于,导致这些对象的值发生变化的JButton与工作表相同,但与JTabbedPane中的非工作DinnerTable位于不同的选项卡上。更新这些DinnerTableModels的有效方法是什么?(我需要其中的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");
}
}
}/
发布于 2017-09-23 01:38:06
TableModel应该存储数据。然后,当数据被更改时,调用适当的fireXXX(.)方法来告诉表重新绘制自身。
然后通过TableModel对数据进行更改,TableModel将更新您的自定义对象。
这基本上意味着DinnerTable类数据结构应该是DinnerTableModel的一部分,而不是单独的类。
有关为自定义对象创建自定义TableModel的逐步指南,请参见TableModel。
https://stackoverflow.com/questions/46375129
复制相似问题