Double click listener on JTable in Java

65,202

Solution 1

Try this:

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 && table.getSelectedRow() != -1) {
            // your valueChanged overridden method 
        }
    }
});

Solution 2

Relocate the code of the event handler into a private method in your host class, then implement the MouseListener or extend the MouseAdapter then invoke the private method there. The first step (i.e. creating the private method helps you invoke the same logic from multiple event handlers).

Detecting the double click in the MouseHandler is made easy by the call to MouseEvent.getClickCount()

Share:
65,202
MooHa
Author by

MooHa

I am a student in my final-year of bachelors degree studying ICT :) I enjoy programming a lot, and due to starting career as graduate developer soon. So my intention here is to learn from you experts on a daily basis.

Updated on April 23, 2020

Comments

  • MooHa
    MooHa about 4 years

    I am curious as to how to call valueChanged overridden method only if a row in JTable has been double clicked. For now the below code snippet achieves one click action or event arrow key to navigate through a list of people and would adjust JLabel accordingly. What I'm trying to do is something similar just like I did for one click, but this time IF and ONLY IF a row has been double clicked dto would change else nothing happens. How do I do this :(

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

    not sure of the rest above...

  • MooHa
    MooHa over 11 years
    see my edit, I am not sure how to call getSelectedDTo only if double clicked
  • Ofek Ron
    Ofek Ron almost 9 years
    should add && row!=-1
  • hamena314
    hamena314 over 8 years
    @OfekRon: Explanation is, that the table might have a certain size, but the data inside does not completely and visually fill it out. So if the user clicks outside of the data area but still inside of the table, the return-value of the row is -1, which should be handled.