0

我有一些相当复杂的数据,目前驻留在哈希表中,这些哈希表指向也包含哈希表的其他类,因为我试图保留的数据中有一对多的关系。

在世界的另一端,我有一个工作得很好的表,只是它与我的数据模型没有任何联系。它有自己的表格模型。我以非常简单的方式创建它-

Object[][] tableData = new Object[4][ tableHeaders.length ];
modelTablet  = new TabletTableModel(tableData, tableHeaders );

我的平板数据模型很简单,

class TabletTableModel extends DefaultTableModel {

   public TabletTableModel(Object rowData[][], Object columnNames[]) {
      super(rowData, columnNames);
   }

   @Override
   public Class getColumnClass(int col) {
        if (col == 0) {
           return String.class;
        } else {
           return Double.class;
        }
   }

   @Override
   public boolean isCellEditable(int row, int col)
   {
      if (col == 0 || col == activeColumn)
         return true;
      else
         return false;
   }
}

这适合我,因为我还必须做一些事情,比如添加和删除行,使用这个简单的数据模型,大部分工作都为我完成了。

class AddRowActionListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
    DefaultTableModel model = (DefaultTableModel)tableTablet.getModel();
    model.addRow(new Object[3]);
    System.out.println(Arrays.deepToString(tableData));
    }
}

我还实现了鼠标侦听器和单元格渲染器,因此当我单击列的标题时,它会变为活动状态,并且相邻列中的单元格会以另一种颜色重新绘制,以表明它们不再可编辑。

到目前为止一切都很好,但是对于我的界面,我有第二个表,它总结了第一个表的结果。它只有三行,没有标题。我想我做的工作可能比我做它时需要做的要多。

modelSummary = new SummaryTableModel(1, tableHeaders.length);
tableSummary = new JTable(modelSummary);

class SummaryTableModel extends DefaultTableModel {

   public SummaryTableModel(int rows, int columns) {
      super(rows, columns);
   }

   @Override
   public Class getColumnClass(int col) {
        if (col == 0) {
           return String.class;
        } else {
           return Double.class;
        }

   @Override
   public boolean isCellEditable(int row, int col)
   {
      if (col == 1 && activeColumn == 2)
         return true;
      else
         return false;
   }
}

所以这给了我一组很好的表格,它们按照预期的方式重新着色,它们将数据限制为有效值并正确格式化(我没有列出我的渲染器)。

但这是应该发生的事情 - 用户在表 1 的第 1 列中输入一个值,然后我需要对第 1 列中的所有值求和,然后将表 2 的第 1 列中的值相加,然后重新计算中的所有值表 1 的第 2 列基于此新值。

相反,如果第 2 列是活动列并且用户更改了表 1 的第 2 列中的值,那么我需要获取表 2 中第 1 列的值并使用它来重新计算表 1 中第 1 列的所有值和还将第 2 列的值求和并将它们放在表 2 的第 2 列中。需要注意的是,用户不能输入新值,这样第 2 列中的数字之和就会超过 100。

表 2 也可以编辑,这需要计算表 1 中的所有值。

所以......在我看来,我应该有一个可观察的,我应该将我的表注册为观察者和可观察的控制器。所以我可以写一个 observable,但我还有我的两个表数据模型。我已经阅读了很多,但是我发现的所有示例都显示在一个可观察的中,它与一些简单的东西一起使用,比如文本字段或表格模型,但没有使用 Observable 类。另一个问题是,我不确定如何执行默认模型默认为我做的大部分很酷的事情(例如添加行或检查类型)。

在我为我的项目添加一个全新的复杂维度之前——有人能给我一些建议吗?以某种不需要重新编写所有默认表模型操作的方式将几乎没有行或列概念的数据模型与表数据模型混合在一起是否容易?目前,整个过程对我来说似乎是难以置信的复杂。我非常需要一些关于这应该如何工作的明确解释。

4

1 回答 1

1

表模型已经是可观察的:您可以向它们添加一个 TableModelListener ,因此每当表模型发生更改时都会被调用。因此,第二个模型可能是第一个模型的侦听器,反之亦然。

我通常不使用 DefaultTableModel,因为它需要我将所有域对象转换为数组。我通常只编写一个包含域对象列表的 AbstractTableModel 子类。获取单元格的值通常包括获取列表中给定行(索引)处的对象模型,然后根据列在对象上调用适当的 getter。

设置值包括在对象上调用适当的设置器并触发事件。

有关表模型的教程,请参见http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data

于 2011-12-14T10:27:29.367 回答