我们在Vaadin中实现了一个标签视图,其中每个标签都有我们扩展的Table类的实例。
在我们的表中,我们添加了一个侦听ENTER-keypress的shortcutlistener。按下输入后,表格将变为可编辑或不可编辑。
我们的问题是:如果我们使表(1)可编辑并切换选项卡,那么旧选项卡中的表(1)仍然保持对ENTER事件的控制,因此我们无法执行新的ENTER-keypress表(2)中的事件,并使表(2)可编辑。
是否有某种方法可以将某种事件绑定到表格中,例如:
If Table.focus() is false then
release event.ENTER
或者,如果还有其他方式,例如Table.OnFocus()
,您可以控制或控制某事。
答案 0 :(得分:1)
我认为问题在于快捷方式侦听器附加到表的父窗口/面板,而不是表本身(Vaadin处理快捷方式操作的方式)。
因此,尝试使用Panel包装每个表(如果您不想要额外的边框,请使用“浅色”样式),看看是否有帮助。
否则我认为每次更改选项卡时都需要添加/删除单个表格快捷方式处理程序。
答案 1 :(得分:0)
所以我解决这个问题的方法是通过清除和添加动作处理程序,就像Jouni建议的那样。
这是代码示例:
从扩展表的类
public void initTableListeners(){
extValueChangeListener = new ExtendedValueChangeListener();
extMouseListener = new ExtendedMouseListener();
extShortcutListener = new ExtendedShortcutListener("enter", KeyCode.ENTER);
setTableListeners();
}
/**
* Registers the default listeners to the table.
*/
public void setTableListeners(){
if(!hasListeners(extValueChangeListener.getClass())){
addListener(extValueChangeListener);
}
if(!hasListeners(extMouseListener.getClass())){
addListener(extMouseListener);
}
if(!hasListeners(extShortcutListener.getClass())){
addShortcutListener(extShortcutListener);
}
}
/**
* Clears the listeners registered to the table.
*/
public void clearTableListeners(){
removeListener(extValueChangeListener);
removeListener(extMouseListener);
removeShortcutListener(extShortcutListener);
}
@Override
public EditTable getTable() {
return this;
}
这是来自标签监听器:
class ExtendedSelectedTabChangeListener implements SelectedTabChangeListener{
@Override
public void selectedTabChange(SelectedTabChangeEvent event) {
// clear old tables listeners
if(currentTab != null){
Component table = currentTab.getComponent();
if(table instanceof EditTableInterface){
((EditTableInterface) table).getTable().clearTableListeners();
}
}
// add new listeners to new table
currentTab = tabsheet.getTab(tabsheet.getSelectedTab());
if(currentTab != null){
Component table = currentTab.getComponent();
if(table instanceof EditTableInterface){
((EditTableInterface)table).getTable().setTableListeners();
}
}
}
}