0

我使用以下语法创建了一个显示表格的 Java GUI:

table = new JTable(new MyTableModel(columnNames,
                                    updateTable(cmbAdversary.getSelectedItem().toString(),
                                                cmbdataType.getSelectedItem().toString())));

其中 columnNames 是字符串 cmbadversary 的向量,smbdataType 是选择 od 组合框。

updateTable 是一个根据组合框选择返回 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 个组合框中的选择并单击选择按钮时无法更新。选择按钮,顺便说一句,调用实现动作侦听器的方法。

请帮帮我。我不是 Java 专业人士,但愿意学习。如果您有任何后续问题,我将很乐意提供详细信息。

4

1 回答 1

1

您的解决方案似乎过于复杂。如果我了解基础知识,则用户从组合框中选择一个值,然后根据选择将一些数据加载到表中。

无需创建自定义表模型即可执行此操作。

TableModel 包含数据。如果您想更改数据,那么执行此操作的一种方法是简单地创建一个新的 TableModel。因此,您将 ActionListener 添加到组合框中。选择项目时,可以将数据恢复并将数据加载到向量或数组中。使用这些数据,您可以创建一个新的 TableModel 并在两行代码中更新 JTable:

DefaultTableModel model = new DefaultTableModel(...);
table.setModel( model );

如果您需要自定义模型以覆盖 getColumnClass() 或 isCellEditable() 方法,则应扩展 DefaultTableModel。我认为没有必要实施整个模型。

于 2011-02-09T15:43:32.760 回答