AbstractTableModel类在Java中究竟是如何工作的?

AbstractTableModel类在Java中究竟是如何工作的?,java,swing,abstracttablemodel,Java,Swing,Abstracttablemodel,我有一个swing应用程序,其中我主要有一个Jtree和一个JTable。应用程序启动时,树显示值列表,表仅显示其列名。从树中选择节点后,需要在表中显示与所选节点相关的一些数据。 我有一个表模型类,它扩展了AbstractTableModel,如下所示 import javax.swing.table.AbstractTableModel; import java.util.List; public class PropertiesTableModel extends AbstractTabl

我有一个swing应用程序,其中我主要有一个Jtree和一个JTable。应用程序启动时,树显示值列表,表仅显示其列名。从树中选择节点后,需要在表中显示与所选节点相关的一些数据。 我有一个表模型类,它扩展了AbstractTableModel,如下所示

import javax.swing.table.AbstractTableModel;
import java.util.List;

public class PropertiesTableModel extends AbstractTableModel{
    private List<Field> fieldList;
    private final static String[] columnNames= new String[]{"Field","Value"};

    public PropertiesTableModel(List<Field> list){
        this.fieldList=list;
    }

    @Override
    public String getColumnName(int columnIndex){
        return columnNames[columnIndex];
    }

    @Override
    public int getRowCount() {
        return fieldList.size();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    //this method is called to set the value of each cell
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Field field= (Field) fieldList.get(rowIndex);

            switch(columnIndex){
                case 0:
                    return field.getFieldDef().getfName();
                case 1:
                    return field.getDefaultValue();
            }
            return null;
    }
    @Override
    public Class<?> getColumnClass(int columnIndex){
        switch (columnIndex){
            case 0:
                return String.class;
            case 1:
                return Object.class;
        }
        return null;
    }

}
    public void populateTableData(List<Field> list){
      this.fieldList=list;
      JTable propertiesTable=new JTable();
      propertiesTable.setModel(new PropertiesTableModel(fieldList));
    }
import javax.swing.table.AbstractTableModel;
导入java.util.List;
公共类PropertiesTableModel扩展了AbstractTableModel{
私有列表字段列表;
私有最终静态字符串[]columnNames=新字符串[]{“字段”,“值”};
公共财产问题模型(列表){
this.fieldList=list;
}
@凌驾
公共字符串getColumnName(int columnIndex){
返回columnNames[columnIndex];
}
@凌驾
public int getRowCount(){
返回fieldList.size();
}
@凌驾
public int getColumnCount(){
返回2;
}
//调用此方法以设置每个单元格的值
@凌驾
公共对象getValueAt(int行索引、int列索引){
Field=(Field)fieldList.get(rowIndex);
开关(列索引){
案例0:
返回字段.getFieldDef().getfName();
案例1:
返回字段。getDefaultValue();
}
返回null;
}
@凌驾
公共类getColumnClass(int columnIndex){
开关(列索引){
案例0:
返回字符串.class;
案例1:
返回Object.class;
}
返回null;
}
}
从另一个类中,我使用以下表格模型

import javax.swing.table.AbstractTableModel;
import java.util.List;

public class PropertiesTableModel extends AbstractTableModel{
    private List<Field> fieldList;
    private final static String[] columnNames= new String[]{"Field","Value"};

    public PropertiesTableModel(List<Field> list){
        this.fieldList=list;
    }

    @Override
    public String getColumnName(int columnIndex){
        return columnNames[columnIndex];
    }

    @Override
    public int getRowCount() {
        return fieldList.size();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    //this method is called to set the value of each cell
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Field field= (Field) fieldList.get(rowIndex);

            switch(columnIndex){
                case 0:
                    return field.getFieldDef().getfName();
                case 1:
                    return field.getDefaultValue();
            }
            return null;
    }
    @Override
    public Class<?> getColumnClass(int columnIndex){
        switch (columnIndex){
            case 0:
                return String.class;
            case 1:
                return Object.class;
        }
        return null;
    }

}
    public void populateTableData(List<Field> list){
      this.fieldList=list;
      JTable propertiesTable=new JTable();
      propertiesTable.setModel(new PropertiesTableModel(fieldList));
    }
public void populateTableData(列表){
this.fieldList=list;
JTable propertiesTable=新的JTable();
setModel(新的PropertiesTableModel(fieldList));
}
当我运行应用程序并从树中选择一个节点时,表中没有填充预期的数据。我确保将fieldList数据传递给TableModel,但只调用getColumnName()和getColumnCount()方法


我想知道我的代码中是否缺少某些内容。

您可能忘记了一个事实,即如果模型中的基础数据发生更改(使用fireTableDataChanged),您需要触发视图(JTable)以从模型中更新自身。。。我假设最初您的列表是空的,数据被添加到列表中,并且数据不显示在JTable中

我可以推荐你去看看GlazedList!!!()


这个免费软件库非常适合你的需要

如果模型中的基础数据发生更改(使用fireTableDataChanged),您可能忘记了一个事实,即需要触发视图(JTable)从模型中更新自身。。。我假设最初您的列表是空的,数据被添加到列表中,并且数据不显示在JTable中

我可以推荐你去看看GlazedList!!!()


这个免费软件库非常适合你的需要

我认为您包含的代码没有问题,所以问题出在其他地方。为了检查方法调用,我添加了一些print语句,但是getValueAt()重写的方法甚至没有被调用。可能是什么原因reason@Sherihan如何将表添加到滚动窗格中?如果您使用的是
scrollpane.add
,请尝试将其替换为
scrollpane.setViewportView(table)
是的,之前我使用add方法将表格添加到scrollpane,现在使用setViewportView()对其进行了更改。我发现您包含的代码没有任何错误,所以问题在别处。为了检查方法调用,我添加了一些print语句,但是getValueAt()重写的方法甚至没有被调用。可能是什么原因reason@Sherihan如何将表添加到滚动窗格中?如果您使用的是
scrollpane.add
,请尝试将其替换为
scrollpane.setViewportView(table)
yes之前我使用add方法将表格添加到scrollpane,现在使用setViewportView()对其进行了更改我将propertiesTable变量声明为一个静态类变量,它得到了解决。@Sherihan
static
是一个糟糕的选择,应该谨慎使用,因为它会导致无数奇怪和奇妙的问题,这些问题很难诊断,并且往往是mt swing应用程序加载时设计不佳的标志,最初,我显示带有列名的表。我有几层面板和一个支撑桌子的JScrollPane。一旦用户单击一个节点,那么表应该显示一些数据。然后需要更新同一个表。所以,我认为让桌子保持静止是可以的。根据你的意见,你还有什么其他的建议来解决这个问题吗?你还是漏掉了一点。并不是因为填充了属性fieldList get,所以会突然显示该列表中的条目。当TableModel用于显示JTable时,JTable请求模型中的行数,我当时假设是0。您需要强制JTable再次查询数据->检查表模型上的fireTableDataChanged方法。正如我之前所说,GlazedLists为你做了这一切。事件列表向TableModel发出数据已添加/删除的信号,…我将propertiesTable变量声明为静态类变量,它得到了解决。@Sherihan
static
是一个糟糕的选择,应该谨慎使用,因为它会导致无数奇怪和奇妙的问题,这些问题很难诊断,并且往往是mt swing应用程序加载时设计不佳的标志,最初,我显示带有列名的表。我有几层面板和一个支撑桌子的JScrollPane。一旦用户单击一个节点,那么表应该显示一些数据。然后需要更新同一个表。所以,我想做一张桌子