2013-02-13 14 views
26

Jestem ciekawy, jak wywołać metodę valueChanged nadpisaną, tylko jeśli wiersz w JTable został dwukrotnie kliknięty. Na razie poniższy fragment kodu uzyskuje jedno kliknięcie lub klawisz strzałki zdarzenia, aby nawigować po liście osób i odpowiednio dostosowywać JLabel. Próbuję zrobić coś podobnego, tak jak zrobiłem to za jednym kliknięciem, ale tym razem JEŚLI TYLKO JEŚLI rząd został podwójnie kliknięty, dto zmieni się, gdy nic się nie stanie. W jaki sposób mogę to zrobić :(Dwukrotne kliknięcie na JTable w Javie

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 { 
      } 

     } 
    }); 
} 

nie pewna reszta powyżej ...

+2

Wydaje się, że MouseListener jest bardziej odpowiedni. –

+0

tak, ale nie masz pewności co do części regulacyjnej, aby uzyskać wiersz – MooHa

+0

Jaki jest problem z uzyskaniem wiersza? Albo jest już wybrane i możesz je uzyskać za pomocą 'JTable.getSelectedRow()' lub używasz punktu zdarzenia myszy i metody: http://docs.oracle.com/javase/7/docs/api/javax/swing /JTable.html#rowAtPoint(java.awt.Point) –

Odpowiedz

2

Przeprowadzki kod obsługi zdarzenia w prywatnym metody w klasie gospodarza, a następnie wdrożyć MouseListener lub przedłużyć MouseAdapter następnie wywołać metodę prywatną tam. pierwszy etap (tj tworzenie metoda prywatny pomaga wywołać tę samą logikę z wielu programów obsługi zdarzeń).

Wykrywanie podwójne kliknięcie w MouseHandler jest ułatwione dzięki zaproszeniu do MouseEvent.getClickCount()

+0

zobacz moją edycję, nie wiem, jak zadzwonić getSelectedDTo tylko wtedy, gdy podwójne kliknięcie – MooHa

63

Spróbuj tego:

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

powinno dodać && wiersz! = - 1 –

+1

@OficRon: Wyjaśnienie, że tabela może mają pewną wielkość, ale dane wewnątrz nie wypełniają się całkowicie i wizualnie. Jeśli więc użytkownik kliknie poza obszarem danych, ale nadal znajduje się wewnątrz tabeli, wartość zwracana wiersza wynosi "-1", którą należy obsłużyć. – hamena314

0

@MooHa Twoja klasa ListDataUI powinny realizuje MouseListener.

Powiązane problemy