2015-02-09 93 views
1

使用setRowSelectionInterval()和setColumnSelectionInterval(),我的表模型setValueAt()方法在某些情况下将选择移动到下一行。当它从(默认)单元格编辑器中调用时(通过用户在单元格中打字并点击标签),代码将工作:选择所需的下一个单元格(下一行中的第一个单元格)。JTable setRowSelectionInterval对JButton没有影响

但是,如果用户使用Return而不是Tab来提交编辑,则选择不会发生;而是选择下面的单元格。这对我来说没问题。

我也有一个JButton来清除一行。按钮的动作函数调用模型的setValueAt()函数以获取所需的单元格。不幸的是,setRowSelectionInterval()和setColumnSelectionInterval()方法没有明显的效果;相反,没有选择单元格。我试过table.requestFocusInWindow()和table.getParent()。requestFocusInWindow(),以及table.changeSelection(row,0,false,false),所有没有明显的影响。

在我去建造SSCCE的麻烦之前,我有什么基本的东西在这里失踪?

在如此重要的情况下,这里的容器层次:

parent JPanel 
    button rows JPanel 
    button row 1 JPanel 
    button row 2 JPanel 
    table JScrollpane 
    JTable 

有问题的按钮在按钮行1

谢谢!

+1

如果这是我的问题,我需要帮助,我会创建并发布[最小示例程序,mcve](http://stackoverflow.com/help/mcve),并希望通过提供最小的程序演示了这个问题,有人可以找出解决方案。 – 2015-02-09 22:27:21

+2

'在我去建造SSCCE的麻烦之前?'建立一个SSCCE并不麻烦。这是一个解决问题的工具,您应该始终创建,以确保您了解问题。顺便说一句,TableModel不应该改变表的选择,所以你不应该重写setValueAt()方法。 TableModel只是管理数据,View处理选择。 – camickr 2015-02-09 22:38:32

+0

您似乎可以唤起''selectNextRow''行动,就像[这里](http://stackoverflow.com/a/20413603/230513)针对滚动动作所建议的那样。 – trashgod 2015-02-09 22:39:41

回答

4

也许您可以使用Table Cell Listener来侦听对表格的编辑。它监听由JTable编辑器完成的实际更改。

然后在提供的Action中,您可以选择相应的行。您可能需要将行动代码包装在SwingUtilities.invokeLater(...)中,以确保在完成表格编辑后执行代码。

+0

谢谢!实际上,在setValueAt()中使用invokeLater()会导致症状消失,但如上所述,这不是正确的解决方案。问题是,我在车内有马! – 2015-02-10 16:30:26