我有一些相当复杂的数据,目前驻留在哈希表中,指向其他也包含哈希表的类,因为我试图保留的数据中存在一对多的关系。
在世界的另一端,我有一个非常好的表,除了它与我的数据模型没有任何连接。它有自己的桌面模型。我以一种非常简单的方式创建它 -
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));
}
}
我还实现了一个鼠标监听器和一个单元格渲染器,这样当我单击一个列的标题时,它就会变为活动状态,并且相邻列中的单元格将以另一种颜色重新绘制,以表明它们不再可编辑。 / p>
到目前为止一切都那么好,但是对于我的界面,我有第二个表总结了第一个表的结果。它只有三行,没有标题。我想我做的时候可能做的工作比我需要做的还多。
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类。另一个问题是我不确定如何做默认模型默认为我做的大部分很酷的事情(比如添加行或检查类型)。
在我为项目添加一个全新的复杂维度之前 - 有人可以给我一些指示吗?是否很容易将几乎没有行或列概念的数据模型以某种方式与表数据模型混合,而不需要再次编写所有默认的表模型操作?目前整个过程对我来说似乎难以置信。我绝对需要一些明确的解释,说明这应该如何运作。
答案 0 :(得分:1)
表模型已经可以观察到:您可以向它们添加TableModelListener,因此只要表模型发生更改就会调用它。所以,第二个模型可能是第一个模型的监听器,反之亦然。
我通常不使用DefaultTableModel,因为它要求我将所有域对象转换为数组。我通常只编写一个包含域对象列表的AbstractTableModel子类。获取单元格的值通常在于将对象模型放在列表中的给定行(索引)中,然后根据列调用对象上的相应getter。
设置值包括在对象上调用适当的setter,然后触发事件。
有关表格模型的教程,请参阅http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data。