2013-02-13 8 views
26

Ich bin neugierig, wie valueChanged überschrieben Methode nur aufgerufen, wenn eine Zeile in JTable doppelt geklickt wurde. Für den Moment erreicht das unten stehende Code-Snippet eine Klick-Aktion oder eine Ereignis-Pfeiltaste, um durch eine Liste von Personen zu navigieren und würde JLabel entsprechend anpassen. Was ich versuche zu tun, ist etwas Ähnliches wie ich für einen Klick getan habe, aber dieses Mal IF und NUR WENN eine Zeile doppelt geklickt wurde dto würde sich ändern, sonst passiert nichts. Wie mache ich dasDoppelklicken Sie auf Listener auf JTable in 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 { 
      } 

     } 
    }); 
} 

nicht sicher, ob der Rest oben :(...

+2

Ein MouseListener scheint besser geeignet. –

+0

ja, aber unsicher über den Einstellteil, um die Zeile zu bekommen – MooHa

+0

Was ist das Problem, die Zeile zu bekommen? Entweder ist bereits ausgewählt und Sie können es mit 'JTable.getSelectedRow()' abrufen oder Sie verwenden den Mausereignispunkt und die Methode: http://docs.oracle.com/javase/7/docs/api/javax/swing /JTable.html#rowAtPoint(java.awt.Point) –

Antwort

2

Stellen Sie den Code des Event-Handler in eine private Methode in Ihrer Host-Klasse, dann implementieren, um die MouseListener oder verlängern MouseAdapter dann gibt die private Methode aufrufen. der erste Schritt (dh die private Methode zu schaffen hilft Ihnen, die gleiche Logik von mehreren Event-Handler aufrufen).

den Doppelklick Erkennen im MouseHandler wird MouseEvent.getClickCount() einfach durch den Aufruf gemacht

+0

sehe meine Bearbeitung, ich bin nicht sicher, wie getSelectedDTo nur aufrufen, wenn Doppelklick – MooHa

63

Versuchen Sie folgendes:

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

sollte hinzufügen && row! = - 1 –

+1

@OfekRon: Erklärung ist, dass die Tabelle könnte haben eine gewisse Größe, aber die Daten darin füllen sie nicht vollständig und visuell aus. Wenn der Benutzer also außerhalb des Datenbereichs klickt, aber immer noch innerhalb der Tabelle, ist der Rückgabewert der Zeile "-1", was behandelt werden sollte. – hamena314

0

@MooHa Ihre Klasse ListDataUI sollte Mouselistener implementiert.

Verwandte Themen