我创建了一个Java GUI,它使用以下语法显示表:
table = new JTable(new MyTableModel(columnNames,
updateTable(cmbAdversary.getSelectedItem().toString(),
cmbdataType.getSelectedItem().toString())));
其中columnNames是字符串的向量 cmbadversary和smbdataType是组合框组合。
和updateTable是一个方法,它根据组合框选择返回Vector of Vector,如下所示:
static Vector updateTable(String FilterVal1 , String FilterVal2)
{
try {
myVector = tssc.testSeverityFunctionService(FilterVal1,FilterVal2);
} catch (Exception e) {
e.printStackTrace();}
return myVector;
}
这是我扩展AbstractTableModel的自定义类MyTableModel的样子:
class MyTableModel extends AbstractTableModel
{
Vector columnNames = new Vector();
Vector Fdb = new Vector();
public MyTableModel(Vector cName,Vector rName){
this.columnNames = cName;
this.Fdb = rName;}
public int getColumnCount() { // number of columns in the model.
return columnNames.size();
}
public int getRowCount() { // number of rows in the model.
return Fdb.size();
}
@Override
public String getColumnName(int col) {
return columnNames.get(col).toString();
}
public Object getValueAt(int row, int col) {
Vector v = (Vector) this.Fdb.get(row);
return v.get(col);
}
@Override
public Class getColumnClass(int c) {
Vector v = (Vector) Fdb.get(0);
return v.get(c).getClass();}
public boolean isCellEditable(int row, int col)
{ return true; }
public void setValueAt(Vector value, int row, int col)
{
for(int i=0;i<value.size();i++)
{ for(int j=0;j<columnNames.size();j++) {
Fdb.setElementAt(value.get(j),j); }
}
fireTableCellUpdated(row, col);
}
}
问题是,当我运行代码时,表格GUI显示初始值,但是当我更改2个组合框中的选择并单击选择按钮时,无法更新。 选择按钮btw调用实现动作侦听器的方法。
请帮帮我。不是Java的专业人士,但愿意学习。如果您有任何后续问题,我将很乐意提供详细信息。
答案 0 :(得分:1)
您的解决方案似乎过于复杂。如果我理解基础知识,用户从组合框中选择一个值,然后根据选择将一些数据加载到表中。
无需创建自定义表模型即可。
TableModel包含数据。如果要更改数据,那么一种方法是简单地创建一个新的TableModel。因此,您将ActionListener添加到组合框中。选择项目后,您将检索数据并将数据加载到Vector或Array中。使用此数据,您可以创建一个新的TableModel并使用两行代码更新JTable:
DefaultTableModel model = new DefaultTableModel(...);
table.setModel( model );
如果需要自定义模型以覆盖getColumnClass()或isCellEditable()方法,则应扩展DefaultTableModel。我认为没有必要实施整个模型。