我的UI Builder代码中有以下代码段:
table.addShortcutListener(new ShortcutListener("Select all", null, KeyCode.A, ModifierKey.CTRL) {
@Override
public void handleAction(Object sender, Object target) {
AbstractSelect t = (AbstractSelect) target;
if (t.isMultiSelect()) {
t.setValue(t.getItemIds());
}
}
});
return table;
这允许按 Ctrl + A 选择表格中的所有项目。这通常在我第一次加载视图时工作,直到我使其中一个表不可见(setVisible(false)
)。使表再次可见后,它不再起作用(甚至不重新加载页面),每当我按 Ctrl + A 时,我得到以下控制台输出:
WARNING: Ignoring action for disabled connector c.b.a.web.ui.builder.table.TranslatedHeaderTable
Nov 03, 2014 11:15:00 AM com.vaadin.event.ConnectorActionManager handleAction
我的代码出了什么问题?我如何实现目标?
答案 0 :(得分:1)
我建议这个修改,对我来说很好(我想comp是Vaadin表)
comp.addShortcutListener(new ShortcutListener("Select all", null, KeyCode.A, ModifierKey.CTRL) {
private static final long serialVersionUID = 1L;
@Override
public void handleAction(Object sender, Object target) {
if (comp.isMultiSelect()) {
comp.setValue(comp.getItemIds());
}
}
});
问题可能是,在本地测试时,某些组件的序列化失败,因此对comp的静态引用(你需要使它成为 final )和一个defaut UID应该这样做特技。 多次测试,错误从未发生过。 欢呼声。
修改强>
我明白当隐藏然后看到桌子时会出现问题。 刚才我想到你可以在一个看不见的表上尝试过CTRL + A:如果是这样的话,那么它是正确的,当一个Component变为不可见时,每个监听器都被置于“待机”状态,直到你再次看到它为止。所以对我来说:
有效,而
给了我
nov 03, 2014 2:19:34 PM com.vaadin.event.ConnectorActionManager handleAction
WARNING: Ignoring action for disabled connector com.vaadin.ui.Table
这意味着这样,你的代码没有任何问题,你必须改变你的功能,并且在一个看不见的表上没有“CTRL + A”(这对imho来说似乎是一件坏事)。另一方面,你可以覆盖setVisible方法,但我不鼓励它。 欢呼声。
答案 1 :(得分:1)
Table
接口的Action.Notifier
实现似乎存在一些问题。在这个Vaadin Forum Post中,Vaadin Devs建议不要将ShortcutListener
添加到表本身,而是添加到表格所在的Panel中。
我的新实施:
private void addCtrlAHandler(final AbstractSelect table) {
Panel panelEnclosingTable = table.findAncestor(Panel.class);
Preconditions.checkArgument(panelEnclosingTable != null, "Table is not enclosed in a panel; cannot add shortcut handlers");
panelEnclosingTable.addShortcutListener(new ShortcutListener("Select all", null, KeyCode.A, ModifierKey.CTRL) {
@Override
public void handleAction(Object sender, Object target) {
if (table.isMultiSelect()) {
table.setValue(table.getItemIds());
}
}
});
}
通过这种解决方法,我得到了预期的行为。