Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Double click listener on JTable in Java

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...

like image 945
MooHa Avatar asked Feb 13 '13 11:02

MooHa


2 Answers

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 
        }
    }
});
like image 105
Anupam Maiti Avatar answered Oct 02 '22 12:10

Anupam Maiti


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()

like image 35
Waleed Almadanat Avatar answered Oct 02 '22 14:10

Waleed Almadanat