在 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 上的侦听器的主要内容,如果未能解决你的问题,请参考以下文章