我有几个JTable,每个都有几列。每个表都显示在JTabbed窗格的不同选项卡上。这些列在表中具有相同的标题名称,但列中的值不同。我试图通过右键单击标题来比较所有表中的标题,然后点击比较。这将打开一个新的JDialog,同时传递一个列表列,其中包含所选的匹配标题:
public void actionPerformed(ActionEvent arg0) {
List<TableColumn> columns = new ArrayList<TableColumn>();
for (int i = 0; i < tables.size(); i++) {
String tableName = tabPane.getTitleAt(i);
JTable tempTable = (JTable) tables.get(tableName);
// Get column at the channel name used
TableColumn col = tempTable.getColumn("chosen header");
// Add the column to the list of channel columns
columns.add(col);
}
new comparisonDialog(UI.getFrame(), "chosen header",
columns);
}
这似乎工作正常,将表的所有公共列存储到传递给新JDialog的列表中。当我在新的JDialog中显示包含这些列的表时,它似乎也有效:
JTable table = new JTable();
for (TableColumn col : passedColumnList) {
col.setHeaderValue(col.getHeaderValue());
table.addColumn(col);
}
但是显示正确的列:
我在这里错过了一些简单的东西吗?
答案 0 :(得分:3)
首先,表格中的数据由表格模型控制,而不是由列模型控制。
其次,TableColumn
有自己的模型(包裹在TableColumnModel
中),对象的更改将被注册监视它的所有模型反映(因此依赖的视图)他们)。
您需要创建一个新的表模型,其中包含每列的数据行,并映射到相应的列。
您应该允许表模型定义列信息,而不是从基础表中“提取”列引用。