2012-04-11 55 views
0

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

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

我会尽量解释: 让我们说,有5行的JTable:

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

还有其他问题。

任何想法可能是错误的吗?

+0

这个问题很热心用[SSCCE](http://sscce.org/) – mKorbel 2012-04-11 22:14:58

回答

0

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

重新打开。您的JTable实例是否已分类?它重写editCell()?如果是这样,将触发基于事件发生的编辑的方法。该方法正在开启不适当的编辑。如果它被覆盖,那么该方法的实现是不好的。

如果您的表未被子类查找调用editCell()。那些可能是不恰当地调用它,因此您可以查找这些调用并开始设置断点或记录语句。

+0

来编辑问题。不幸的是,这不是我的代码,JAVA也不是我最擅长的。正如我所看到的,JTable不是分类的。有一种方法public void editingStopped(ChangeEvent anEvent),它在每次单元格离开编辑模式时都会运行。我评论了整个代码,并且不稳定的行为停止了。我想我太快了,不能指责JTable控制。我想我现在明白为什么我描述的行为正在发生。我试图找出这个监听器的设置。我找不到它。是否有editStarted事件?谢谢。 – bobetko 2012-04-11 22:33:08

+0

没有编辑开始的事件。为了拦截你需要调用JTable.editCell()或JTable的子类并覆盖editCell()。 – chubbsondubs 2012-04-12 01:50:33

1

这听起来有点奇怪。你是完全无效的表和通知监听器等行数已经改变?

在你的表模型,遍历所有的的TableModelListeners和火TableModelEvent“插入”事件:

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); 

您可以添加自己的听众表拦截在你喜欢的任何方式的事件和编辑细胞。