2017-03-20 134 views
0

我已經採取了從另一個問題,這個代碼,並希望有人能澄清幾點:JTable的鼠標監聽

table.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     int r = table.rowAtPoint(e.getPoint()); 
     if (r >= 0 && r < table.getRowCount()) { 
      table.setRowSelectionInterval(r, r); 
     } else { 
      table.clearSelection(); 
     } 

     int rowindex = table.getSelectedRow(); 
     if (rowindex < 0) 
      return; 
     if (e.isPopupTrigger() && e.getComponent() instanceof JTable) { 
      JPopupMenu popup = createYourPopUp(); 
      popup.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
}); 

我的理解是,它定義爲「r」行獲取行的鼠標事件點。但爲什麼'rowindex'使用table.getSelectedRow()初始化?爲什麼不使用變量'r'。他們不是一回事嗎?

也 - 我很困惑e.isPopupTrigger()。我閱讀文檔,並將它引用爲返回mouseevent是否爲彈出窗口的觸發器......訣竅顯然是在名稱中 - 但我不確定哪些條件使其成爲真或假(特別是彈出.show(),其第一個參數是調用者,在if語句中)。

對不起,我只是不想盲目複製代碼!

感謝

回答

2

但爲什麼 '的rowIndex' 使用table.getSelectedRow初始化()?爲什麼不使用變量'r'。

代碼正在檢查鼠標點是否在表中的最後一行之後。這可能發生在您使用時:

table.setFillsViewportHeight(true); 

並且您的表數據不會完全填充滾動窗格的視口中的所有行。

因此,如果您在最後一行之後單擊,rowAtPoint(...)方法將返回-1,這將與getSelectedRow()返回的行不同。

這將導致行選擇被刪除。

現在您可以使用getSelectedRow()方法來確定您是否有選定的行並因此顯示彈出窗口。

我很困惑e.isPopupTrigger()。

用於顯示彈出菜單的MouseEvent對於不同的平臺可能會有所不同。

+0

編輯 - 我只是重讀你的答案,感謝您的快速回復,雖然 – NickW

+0

啊,感謝您的額外信息 - 我現在得到兩個變量。 RE isPopupTrigger() - 我仍然不知道它甚至在任何平臺上。從我的(天真的)看來,它看起來像唯一表示mouseevent與彈出窗口相關的是if語句的主體。考慮到if塊條件,這是沒有意義的。 – NickW

+0

@NickW,看到更新的答案,我希望更好地解釋爲什麼rowAtPoint()和getSelectedRow()可以返回不同的值。 – camickr