2010-11-08 31 views
6

Tôi có một JTable và một trình đơn bật lên dành riêng cho mỗi hàng. Tôi muốn tính toán hàng mà người dùng nhấp chuột phải của mình (Windows L & F) để hiển thị menu bật lên.Tìm hàng JTable mà trên đó một menu bật lên đã được gọi

Tôi tạo một MouseListener cho bảng, vì vậy nó sẽ nhận được MouseEvent tại nhấp chuột và hiển thị menu bật lên ở đúng vị trí. Nhưng khi người dùng chọn một mục ra khỏi menu bật lên, tôi không thể tìm ra cách để xác định hàng nào là nơi người dùng nhấp chuột phải vào vị trí đầu tiên. Sự kiện cho lời gọi trình đơn bật lên không có tọa độ x, y khi nhấp chuột phải diễn ra nữa.

Tôi đã xem xét vị trí của cửa sổ bật lên, nhưng thuộc về khung, chứ không phải bảng, vì vậy không phải bảng hoặc cha mẹ đều có giá trị x, y phù hợp với những gì tôi muốn.

Tôi đã làm việc xung quanh nó bằng cách phân lớp JPopupMenu và thiết lập các giá trị x và y mà tôi muốn nó có trong Trình xử lý ảnh. Nhưng có vẻ như với tôi như thế này sẽ là một vấn đề chung cho bất cứ ai muốn đặt một menu popup trên một JTable, và tôi tự hỏi những gì tôi đã bỏ qua.

Có cách nào đơn giản hơn để thực hiện việc này, đặc biệt là cách không liên quan đến phân lớp JPopupMenu?

+0

bản sao có thể có của [Java Swing JTable; Right Click Menu (Làm thế nào để có được nó để "chọn" aka làm nổi bật hàng)] (http://stackoverflow.com/questions/3558293/java-swing-jtable-right-click-menu-how-do-i- get-it-to-select-aka-highlight-t) –

Trả lời

14
JTable.rowAtPoint(...); 

Bạn có thể lấy điểm từ MouseEvent.

Edit:

table.addMouseListener(new MouseAdapter() 
{ 
    public void mouseReleased(MouseEvent e) 
    { 
     if (e.isPopupTrigger()) 
     { 
      JTable source = (JTable)e.getSource(); 
      int row = source.rowAtPoint(e.getPoint()); 
      int column = source.columnAtPoint(e.getPoint()); 

      if (! source.isRowSelected(row)) 
       source.changeSelection(row, column, false, false); 

      popup.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
}); 
+0

Vâng, một phần của vấn đề là không có MouseEvent tại chỗ trong mã nơi tôi muốn thông tin này. MouseEvent đã được tiêu thụ để hiển thị menu bật lên ở đúng vị trí; sự kiện vừa xảy ra là ActionEvent, được tạo khi người dùng chọn tùy chọn menu. Vì vậy, không có X, Y kết nối với sự kiện này. Tôi có thể lưu MouseEvent (hoặc X, Y) và chuyển nó cho sự kiện của tôi theo nhiều cách khác nhau, nhưng tôi đang tìm cách 'dọn dẹp' hơn. – user492820

+1

@ user492820, vấn đề là mã của bạn có cấu trúc sai. "Cách dọn dẹp" hơn là chọn hàng KHI cửa sổ bật lên được hiển thị. Xem chỉnh sửa của tôi cho mã chung để làm điều này. – camickr

2

Nếu bạn không nhớ chọn hàng của bạn trên nút nhấp chuột phải, sau đó trong MouseListener sử dụng JTable.rowAtPoint() và chọn hàng nếu nó không được chọn, và sau đó trong người nghe bật lên sử dụng JTable.getSelectedRows() để xử lý các hàng của bạn. Hoặc bạn có thể lưu chúng trong một cấu trúc dữ liệu riêng biệt mà bạn có thể truy cập từ trình lắng nghe trình đơn bật lên của mình.

+0

Không, tôi không muốn chọn nó; Tôi nghĩ đó là hành vi phi tiêu chuẩn, ít nhất là trên một hộp Windows. Tôi đã hy vọng cho một cách để tìm ra mà không có điều đó. – user492820

+0

tôi tin rằng đó là hành vi tiêu chuẩn để chọn một ô hoặc một hàng mà trên đó nhấp chuột phải đã được thực hiện. Nếu bạn không muốn chọn hàng, hãy lưu số hàng trong một số thông số có thể truy cập từ trình lắng nghe trình đơn của bạn. –

+0

Vâng, ít được biết đến sự thật về các hệ điều hành được cho là nổi tiếng. Tôi không bao giờ sử dụng nhấn chuột phải để chọn một cái gì đó, và quản lý để quên rằng nó đã làm như vậy. Cảm ơn, tôi sẽ sử dụng (và camickr đã hiển thị mã cho nó trong bình luận dưới đây. – user492820

Các vấn đề liên quan