在Vaadin表中选择所有快捷键(Ctrl-A)?

时间:2014-11-03 10:29:54

标签: vaadin shortcut vaadin7

我的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

我的代码出了什么问题?我如何实现目标?

2 个答案:

答案 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变为不可见时,每个监听器都被置于“待机”状态,直到你再次看到它为止。所以对我来说:

  • 调用setVisible(假);
  • 调用setVisible(真);
  • “CTRL + A”

有效,而

  • 调用setVisible(假);
  • “CTRL + A”

给了我

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());
            }
        }
    });
}

通过这种解决方法,我得到了预期的行为。