每当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?如果没有,有没有更好的方法呢?
答案 0 :(得分:0)
嗯,有oppositeComponent
。奇怪的是,如果这个监听器附加到表,文档告诉该表应该是“源”组件(因为它是一个FocusLost事件,失去焦点的组件是表本身)。
答案 1 :(得分:0)
你能不能记录一下行&amp;列使用
table.getSelectionModel().addListSelectionListener(...);
table.getColumnModel().getSelectionModel().addListSelectionListener(...);
所以每次使用点击都会更新它,而不仅仅是焦点事件?
答案 2 :(得分:0)
如果您只想保存在单元格中输入的数据(无需点击返回),那么您就不需要做任何事情。更新后的信息包含在TableModel
的{{1}}内。
否则,您可以查看JTable
和相关的.tableChanged()
,它会为您提供修改的最后一行/列。您可以保留一个始终更新到最新事件行/列的变量。我想如果你改变一个单元格数而不点击返回,它仍会注册为一个事件。
答案 3 :(得分:0)
但是,下面的条件始终为false,因为源始终是JTextField或JComboBox。
这意味着在开始编辑单元格时会生成focusLost事件。所以问题是你为什么要这样做?我认为您需要说出您的实际要求,因为您尝试解决方案似乎不合适。