【问题标题】:How AbstractTableModel class exactly works in Java?AbstractTableModel 类在 Java 中是如何工作的?
【发布时间】:2016-03-09 09:13:42
【问题描述】:

我有一个 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));
    }

当我运行应用程序并从树中选择一个节点时,表中没有填充预期的数据。我确保将 fieldList 数据传递给 TableModel,但只有 getColumnName() 和 getColumnCount() 方法被调用。

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

【问题讨论】:

  • 我认为您包含的代码没有任何问题,所以问题出在其他地方。
  • 为了检查方法调用,我添加了一些打印语句,但 getValueAt() 覆盖的方法甚至没有被调用。可能是什么原因
  • @Sherihan 您如何将表格添加到其滚动窗格中?如果您使用的是 scrollpane.add ,请尝试将其替换为 scrollpane.setViewportView(table)
  • 是的,之前我使用 add 方法将表格添加到滚动窗格,现在使用 setViewportView() 进行更改

标签: java swing abstracttablemodel


【解决方案1】:

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

我可以推荐你看看 GlazedLists !!! (http://www.glazedlists.com/)

这个免费软件库非常适合您的需求!

【讨论】:

  • 我将 propertiesTable 变量声明为静态类变量,结果成功了。
  • @Sherihan static 是一个糟糕的选择,应该谨慎使用,因为它会导致无穷无尽的奇怪而奇妙的问题,这些问题难以诊断,并且往往是糟糕设计的标志
  • 在 mt swing 应用程序中,当应用程序加载时,最初我会显示带有列名的表格。我有几层面板和一个拿着桌子的 JScrollPane。一旦用户点击一个节点,表格就会显示一些数据。然后需要更新同一个表。所以,我认为使表格静态很好。根据您的意见,您还有其他解决此问题的建议吗?
  • 你仍然错过了一点。这不是因为您的属性 fieldList 得到填充,才会突然显示该列表中的条目。当 TableModel 用于显示 JTable 时,JTable 会请求模型中的行数,我假设当时为 0。您需要强制 JTable 再次查询数据 -> 检查表模型上的 fireTableDataChanged 方法。正如我之前所说,GlazedLists 会为您完成这一切。 EventList 向 TableModel 发出信号表明数据已被添加/删除,...
猜你喜欢
  • 1970-01-01
  • 2013-03-08
  • 2012-08-02
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
相关资源
最近更新 更多