0

我有一些旧的 Java 应用程序使用 JTable 来显示一些数据并允许输入。JTable 有 2 列。在 JTable 旁边,有一个将新行添加到 JTable 中的按钮。

我的问题是导航 JTable 时 Tab 和 Enter 键盘键和鼠标单击的行为。

我将尝试解释:假设 JTable 中有 5 行:

  1. 如果我用鼠标单击一行,有时整行会突出显示,有时单元格会进入编辑模式(除了整行被突出显示)
  2. 有时,选定的行会突出显示,但突出显示的行上方或下方的单元格会进入编辑模式
  3. 如果我使用 Tab 从一个字段跳到另一个字段,可编辑字段始终位于突出显示的行上方。

还有其他问题。

任何想法可能有什么问题?

4

2 回答 2

1

这听起来有点奇怪。您是否完全使表无效并通知侦听器等行数已更改?

在您的表模型中,遍历所有TableModelListeners 并触发 TableModelEvent 'insert' 事件:

TableModelEvent event = new TableModelEvent(
                modelInstance,
                positionOfNewRow,
                positionOfNewRow,
                TableModelEvent.ALL_COLUMNS,
                TableModelEvent.INSERT);

for (TableModelListener l: listeners) {
    l.tableChanged(event);
}

如果您无法解决问题,则可以为表编写自己的行为。

这些是一些有用的方法:

editCellAt(int row, int column);
rowAtPoint(Point point);
columnAtPoint(Point point);

您可以将自己的侦听器添加到表中,以拦截事件并以您喜欢的任何方式编辑单元格。

于 2012-04-11T22:03:45.407 回答
0

关闭表格单元格编辑。看看它的表现如何。通常,这可以通过将 TableModel.isCellEditable() 方法更改为简单地返回 false 来处理。

重新打开它。您的 JTable 实例是子类的吗?它是否覆盖了editCell()?如果是这样,这就是将根据事件发生与否触发编辑的方法。该方法正在不恰当地打开编辑。如果该方法被覆盖,则该方法的实现很糟糕。

如果您的表没有子类化,请查找对 editCell() 的调用。那些可能不恰当地调用它,因此您可以查找这些调用并开始设置断点或日志语句。

于 2012-04-11T22:02:31.063 回答