在 Java 中双击 JTable 上的侦听器

Posted

技术标签:

【中文标题】在 Java 中双击 JTable 上的侦听器【英文标题】:Double click listener on JTable in Java 【发布时间】:2013-01-28 22:47:55 【问题描述】:

我很好奇只有​​在JTable 中的一行被双击时如何调用valueChanged 被覆盖的方法。现在,下面的代码 sn-p 实现了单击操作或事件箭头键来浏览人员列表,并将相应地调整 JLabel。我正在尝试做的是类似于我单击一次所做的事情,但是这次如果并且仅当双击一行dto 时会改变,否则什么也不会发生。我该怎么做:(

   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 
            

        
    );

不确定上面的其余部分......

【问题讨论】:

鼠标监听器似乎更合适。 是的,但不确定获取行的调整部分 获取行有什么问题?要么已经被选中,你可以用JTable.getSelectedRow()得到它,或者你使用鼠标事件点和方法:docs.oracle.com/javase/7/docs/api/javax/swing/… 【参考方案1】:

试试这个:

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

【讨论】:

应该加上 && 行!=-1 @OfekRon:解释是,表可能有一定的大小,但里面的数据并没有完全和直观地填满它。所以如果用户点击了数据区域之外,但仍然在表格内部,则该行的返回值为-1,应该进行处理。【参考方案2】:

将事件处理程序的代码重新定位到宿主类中的私有方法中,然后实现MouseListener 或扩展MouseAdapter,然后在那里调用私有方法。第一步(即创建私有方法可帮助您从多个事件处理程序调用相同的逻辑)。

通过调用MouseEvent.getClickCount() 可以轻松检测MouseHandler 中的双击

【讨论】:

查看我的编辑,我不确定如何调用 getSelectedDTo 只有在双击时才能调用【参考方案3】:

@MooHa 你的 ListDataUI 类应该实现 MouseListener。

【讨论】:

以上是关于在 Java 中双击 JTable 上的侦听器的主要内容,如果未能解决你的问题,请参考以下文章

如何将侦听器添加到 osx 上的 java 停靠图标

在双击事件侦听器上停止 href 进入下一页

如何检查 recyclerview 适配器上的空侦听器?

单元格选择后更新数据库(JTable)

使用java在android中双击问题

JTable 不会在将数据插入 mysql 时重新绘制/刷新