2015-02-09 90 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