如何在Focus Lost事件期间选择JTable并选择Row

时间:2011-06-09 12:59:56

标签: java jtable

每当JTable中存在lostFocus时,我需要捕获现有单元格的行和列。

但是,下面的条件始终为false,因为源始终是JTextField或JComboBox。

public void focusLost(FocusEvent e) {
int row, col;

Object source = e.getSource();
if(((Component) source).getParent() instanceof JTable_Ext){  //<-- always false
    table = (JTable_Ext) ((Component) source).getParent();
    row = table.getSelectedRow();
    col = table.getSelectedColumn();
}

为了缓解上述情况,我记得FocusGained期间的行和col(作为类级别变量)。问题是,如果用户在JTable内的所有位置点击得非常快,那么行和列信息就会不同步。

在FocusLost期间有没有办法获得Row和Col?如果没有,有没有更好的方法呢?

4 个答案:

答案 0 :(得分:0)

嗯,有oppositeComponent。奇怪的是,如果这个监听器附加到表,文档告诉该表应该是“源”组件(因为它是一个FocusLost事件,失去焦点的组件是表本身)。

http://download.oracle.com/javase/1.4.2/docs/api/java/awt/event/FocusEvent.html#getOppositeComponent%28%29

答案 1 :(得分:0)

你能不能记录一下行&amp;列使用

table.getSelectionModel().addListSelectionListener(...);
table.getColumnModel().getSelectionModel().addListSelectionListener(...);

所以每次使用点击都会更新它,而不仅仅是焦点事件?

答案 2 :(得分:0)

如果您只想保存在单元格中输入的数据(无需点击返回),那么您就不需要做任何事情。更新后的信息包含在TableModel的{​​{1}}内。

否则,您可以查看JTable和相关的.tableChanged(),它会为您提供修改的最后一行/列。您可以保留一个始终更新到最新事件行/列的变量。我想如果你改变一个单元格数而不点击返回,它仍会注册为一个事件。

答案 3 :(得分:0)

  

但是,下面的条件始终为false,因为源始终是JTextField或JComboBox。

这意味着在开始编辑单元格时会生成focusLost事件。所以问题是你为什么要这样做?我认为您需要说出您的实际要求,因为您尝试解决方案似乎不合适。