2013-02-13 25 views
26

Tôi tò mò muốn gọi phương thức ghi đè valueChanged nếu một hàng trong JTable đã được nhấp đúp. Hiện tại, đoạn mã dưới đây đạt được một hành động nhấp chuột hoặc phím mũi tên sự kiện để điều hướng qua danh sách mọi người và sẽ điều chỉnh JLabel tương ứng. Những gì tôi đang cố gắng làm là một cái gì đó tương tự như tôi đã làm cho một cú nhấp chuột, nhưng thời gian này NẾU và CHỈ NẾU một hàng đã được nhấp đúp chuột dto sẽ thay đổi khác không có gì xảy ra. Làm thế nào để làm điều này :(Trình nghe nhấp chuột đôi trên JTable trong Java

class ListDataUI { 

    public void addListSelectionListener(ListSelectionListener listSelectionListener) { 
      summaryTable.getSelectionModel().addListSelectionListener(listSelectionListener); 

public T getSelectedDTO() { 
     final int selectedRowIndex = summaryTable.getSelectedRow(); 
     if (selectedRowIndex != -1) { 
      return data.get(summaryTable.convertRowIndexToModel(selectedRowIndex)); 
     } else { 
      return null; 
     } 
    } 
     } 
    } 




    class MainMenu extends javax.swing.JFrame { 
    private void initListeners() { 
    searchTable.addListSelectionListener(new ListSelectionListener() { 

     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      if (!e.getValueIsAdjusting()) { 
       AcademicDTO dto = (AcademicDTO) searchTable.getSelectedDTO(); 
       acImgLabel.setIcon(new ImageIcon()); 
       label_name.setText(dto.getTitle() + " " + dto.getForename() + " " + dto.getSurname()); 
       label_role.setText("Role: " + dto.getRole()); 
       label_phone.setText("Phone: " + dto.getPhone()); 
       label_room.setText("Room: " + dto.getRoom()); 
       label_hours.setText("Hours: " + dto.getHours()); 
       label_mobile.setText("Mobile: " + dto.getMobile()); 
       if (dto.getImage() != null) { 
        acImgLabel.setIcon(new ImageIcon(dto.getImage())); 
       } 
      } 
     } 
    }); 
} 

} 


private void initListeners() { 
    contactTable.addMouseListener(new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      ContactDTO dto = (ContactDTO) contactTable.getSelectedDTO(); 
      if (e.getClickCount() == 2) { 
       System.out.println(dto.getForename()); 
      } else { 
      } 

     } 
    }); 
} 

không chắc chắn của phần còn lại ở trên ...

+2

Trình ghi chuột có vẻ phù hợp hơn. –

+0

có, nhưng không chắc chắn về phần điều chỉnh để có được hàng – MooHa

+0

Vấn đề nhận hàng là gì? Hoặc là đã được chọn và bạn có thể lấy nó bằng 'JTable.getSelectedRow()' hoặc bạn sử dụng điểm sự kiện chuột và phương thức: http://docs.oracle.com/javase/7/docs/api/javax/swing /JTable.html#rowAtPoint(java.awt.Point) –

Trả lời

2

Relocate mã của trình xử lý sự kiện vào một phương pháp riêng trong lớp máy chủ của bạn, sau đó thực hiện các MouseListener hoặc mở rộng MouseAdapter sau đó gọi phương thức riêng ở đó. bước đầu tiên (tức là tạo ra phương pháp riêng giúp bạn gọi cùng một logic từ nhiều xử lý sự kiện).

Phát hiện các nhấp chuột đôi trong MouseHandler được thực hiện dễ dàng bởi các cuộc gọi đến MouseEvent.getClickCount()

+0

xem chỉnh sửa của tôi, tôi không chắc chắn cách gọi getSelectedDTo chỉ khi nhấp đúp – MooHa

63

Hãy thử điều này:

mytable.addMouseListener(new MouseAdapter() { 
    public void mousePressed(MouseEvent mouseEvent) { 
     JTable table =(JTable) mouseEvent.getSource(); 
     Point point = mouseEvent.getPoint(); 
     int row = table.rowAtPoint(point); 
     if (mouseEvent.getClickCount() == 2) { 
      // your valueChanged overridden method 
     } 
    } 
}); 
+4

nên thêm && row! = - 1 –

+1

@OfekRon: Giải thích là, bảng có thể có kích thước nhất định, nhưng dữ liệu bên trong không hoàn toàn và trực quan điền vào. Vì vậy, nếu người dùng nhấp vào bên ngoài vùng dữ liệu nhưng vẫn ở bên trong bảng, giá trị trả về của hàng là '-1', sẽ được xử lý. – hamena314

0

@MooHa ListDataUI lớp của bạn nên thực hiện MouseListener.