2017-06-14 80 views
0

我得到我的周圍JTable頭此刻然而這兩次現在我有這種類型的問題,我認爲這是錯誤的我的方法,損壞的行和列時,拖動鼠標

我有一個JTabbedPane將三個選項卡設置爲表格,我運行測試以查看選定選項卡的檢測是否有效,以及是否成功獲取行信息和列信息。

我在這三張牌桌上增加了一張MouseListener,通過抓取該事件的getRow()getColumn(),可靠地產生了良好的結果!然而,這並不能產生可靠的結果,因爲我現在發現,如果我點擊一行,按住鼠標按鈕並拖動到另一行,然後釋放getRowgetColumn將使單元格單擊,但突出顯示的行將是我發佈!

public void detectMouseClickRow(JTable aTabbedPane) { 
     aCol = aTabbedPane.getSelectedColumn(); 
     aRow = aTabbedPane.getSelectedRow(); 
     valueAt = (String)aTabbedPane.getValueAt(aRow, aCol); 
} 

如何獲取突出顯示的行的行和列信息?否則,當有人來點擊一個工作來刪除,他們可以選擇錯誤的?

+0

'getSelectedRow/Column'是在返回選擇的「分」點所選的範圍。基於「最小」的測試,似乎沒有任何直接的方法來確定鼠標從哪個細胞釋放出來 – MadProgrammer

回答

2

根據我有限的測試,唯一的「貌似」可靠的方式來獲得選擇的起點,就是用行和列直接... ListSelectionModel

DefaultTableModel model = new DefaultTableModel(10, 10); 
JTable table = new JTable(model); 
ListSelectionListener listener = new ListSelectionListener() { 
    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     if (e.getValueIsAdjusting()) { 
      return; 
     } 
     int row = table.getSelectionModel().getAnchorSelectionIndex(); 
     int col = table.getColumnModel().getSelectionModel().getAnchorSelectionIndex(); 

     System.out.println(row + "x" + col); 
    } 
}; 

table.getSelectionModel().addListSelectionListener(listener); 
table.getColumnModel().getSelectionModel().addListSelectionListener(listener); 

現在,這個例子是通過ListSelectionListenerListSelectionModel交互驗證這個想法,但你可以很輕鬆地將這個想法到您的MouseListener並提取選擇anchor指數有

+0

這似乎有點複雜,我認爲這是一個常見的要求 - 或者我在這裏錯過了一些東西。也許我可以使用X,Y合作社,然後減去父母x,y。 。 。 。明白了嗎? 這是行/列表格佈局的'首選'方法嗎? 我可以通過控制HIGHLIGHT並強制它停留在table.getRow()和table.getColumn()結果上嗎? – JackDaw

+0

很多都歸結於你可能認爲的「共同需求」 - 因爲「MouseListener」的工作方式,你不會得到'mouseClicked'事件,只會發生'mouseReleased'事件。當JTable基於設計者的選擇調用getSelectedRow/Column時,「JTable」API會「盡力」猜測應該返回的內容(只是返回最小的選定值)。 'ListSelectionModel'確實提供了一些功能('anchor'和'lead')。這是20多年以來的工作方式,所以我不確定我是否真的看到了你的觀點。 – MadProgrammer

+0

@JackDaw您可以使用鼠標的x/y點來計算髮生'MouseReleased'事件的單元格,但是您必須先測試它是否確實在單元格的選定範圍內。你能控制亮點嗎?那麼,你想爲行和列實現你自己的'ListSelectionModel'? – MadProgrammer