【发布时间】:2009-06-25 20:32:13
【问题描述】:
我正在使用 DefaultTableModel 的扩展,如下所示:
这是更新后的新成就表模型以反映来自某些答案的输入。
public AchievementTableModel(Object[][] c, Object[] co) {
super(c,co);
}
public boolean isCellEditable(int r, int c) {return false;}
public void replace(Object[][] c, Object[] co) {
setDataVector(convertToVector(c), convertToVector(co));
fireTableDataChanged();
}
我的 GUI 是一个具有以下属性的 JTable:
if(table==null)
table = new JTable(model);
else
table.setModel(model);
table.setFillsViewportHeight(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.getTableHeader().setReorderingAllowed(false);
table.getTableHeader().setResizingAllowed(false);
table.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
table.getColumnModel().setColumnSelectionAllowed(false);
我有一个 JComboBox 可以选择要显示的数据。 TableModel 通过调用 model.replace(cells) 进行更新,然后再次运行上述表格创建代码。
当在 GUI JTable 中选择一行并打印 table.getSelectedRow() 值时,我总是在使用第一次选择的 model.replace(cells) 调用更改表数据后得到 -1,即使我重新选择第一个 JComboBox 选项。我失踪有什么原因吗?我应该更改一些代码吗?
编辑:代码在尝试回答这个问题时发生了很大变化,所以这里是更新的代码。上面是新的 AchievementTableModel。
这将设置模型和表格以正确查看并显示在 ScrollPane 中
if(model==null)
model = new AchievementTableModel(cells, columns);
else
model.replace(cells, columns);
if(table==null) {
table = new JTable(model);
table.setFillsViewportHeight(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
table.getColumnModel().setColumnSelectionAllowed(false);
table.getTableHeader().setResizingAllowed(false);
} else
table.setModel(model);
column = table.getColumn(columns[0]);
column.setPreferredWidth(25);
column = table.getColumn(columns[1]);
column.setPreferredWidth(225);
column = table.getColumn(columns[2]);
column.setPreferredWidth(40);
table.doLayout();
add(new JScrollPane(table), BorderLayout.CENTER);
【问题讨论】:
-
你能显示你打印table.getSelectedRow()的方法吗
-
有一个附有动作的按钮,它依赖于 getSelectedRow() 方法,并将选定的行打印到 System.out。我选择一行并单击按钮,但总是得到 -1 输出。
-
MMMhh 您不必重写所有这些方法。您正在重复超类已经做的事情,并且可能在此过程中失去了一些听众。评论所有这些方法并按照克林特的建议去做。让我们看看会发生什么。
-
我删除了所有不需要的额外覆盖方法,因此只剩下 isCellEditable 和替换。然后将构造函数重做为 super(c,co);它没有改变任何东西。
-
调用table = new JTable的原因是什么,反对table.setModel(model)?
标签: java user-interface jtable selection