【问题标题】:JTable erratic behaviorJTable 不稳定行为
【发布时间】:2012-04-24 06:11:24
【问题描述】:

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

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

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

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

还有其他问题。

有什么想法可能有什么问题吗?

【问题讨论】:

  • 这个问题非常适合用SSCCE编辑问题

标签: java swing jtable


【解决方案1】:

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

在您的表模型中,循环 所有 的 TableModelListener 并触发 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);

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 很遗憾,这不是我的代码,JAVA也不是我最擅长的。正如我所看到的,JTable 没有被子类化。每次单元格退出编辑模式时,都会运行一种方法 public void editingStopped(ChangeEvent anEvent)。我在里面注释了整个代码并且不稳定的行为停止了。我想我太快了,不能怪 JTable 控制。我想我现在明白为什么我描述的行为会发生。我试图弄清楚这个监听器的设置位置。我找不到它。有 editorStarted 事件吗?谢谢。
    • 没有editingStarted事件。为了拦截你需要调用 JTable.editCell() 或子类 JTable 并覆盖 editCell()。
    猜你喜欢
    • 2013-07-09
    • 2011-11-20
    • 2011-01-27
    • 2019-08-02
    • 1970-01-01
    • 2011-04-24
    • 2015-08-19
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多