JTable不稳定的行为

时间:2012-04-11 21:41:32

标签: java swing jtable

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

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

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

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

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

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

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

重新打开。您的JTable实例是否为子类?是否重写editCell()?如果是这样,那么将根据事件发生或未发生的事件触发编辑。该方法正在不恰当地进行编辑。如果被覆盖,那么该方法的实现就会很糟糕。

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

相关问题