Swing 难以理解如何同时使用表模型和观察值

Swing 难以理解如何同时使用表模型和观察值,swing,jtable,observablecollection,tablemodel,Swing,Jtable,Observablecollection,Tablemodel,我有一些相当复杂的数据,目前驻留在哈希表中,这些哈希表指向其他也包含哈希表的类,因为我试图保留的数据中有一个或多个关系 在世界的另一端,我有一个工作非常好的表,除了它与我的数据模型没有任何连接。它有自己的表格模型。我以一种非常简单的方式创建它- Object[][] tableData = new Object[4][ tableHeaders.length ]; modelTablet = new TabletTableModel(tableData, tableHeaders ); 我的

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

在世界的另一端,我有一个工作非常好的表,除了它与我的数据模型没有任何连接。它有自己的表格模型。我以一种非常简单的方式创建它-

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类。另一个问题是,我不知道如何做大多数很酷的事情(比如添加行或检查类型),默认模型在默认情况下很乐意为我做这些事情


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

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

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

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

有关表格模型的教程,请参见