Jface ContentProposalAdapter不能处理第一个键入的char

时间:2013-05-15 16:19:24

标签: java events event-handling swt jface

我正在尝试为我在SWT / JFace应用程序中使用的Text小部件进行字段辅助。

我在Text组件上添加了一个ModifyListener,当这个由ModifyEvent触发时,调用setAutoCompletion()方法和下一个方法:

问题是它只在输入至少两个字符后才有效。这意味着如果我有“387”作为建议,我必须输入“3”,然后输入“8”。弹出窗口仅显示第二个“8”字符。

之后,它始终按预期工作,但我不知道为什么Text第一次收到它不起作用的事件。我一直在寻找“stackoverflow”和谷歌,但没有找到任何东西。

    private void setAutoCompletion(final Widget widget, final String value) {
    try {
        LOG.debug("Llamada desde " + widget.toString());
        ContentProposalAdapter adapter = null;
        final String[] proposals = getAllProposals(widget, value);
        LOG.debug("Las sugerencias para el widget son: " + proposals);
        for (final String s : proposals) {
            LOG.debug(s);
        }
        final SimpleContentProposalProvider scp = new SimpleContentProposalProvider(proposals);
        scp.setProposals(proposals);
        scp.setFiltering(true);
        if (widget instanceof Text) {
            adapter = new ContentProposalAdapter((Text) widget, new TextContentAdapter(), scp, null, null);
        } else {
            adapter = new ContentProposalAdapter((Combo) widget, new ComboContentAdapter(), scp, null, null);
        }
        adapter.setEnabled(true);
        adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
    } catch (final Exception e) {
        MessagePanel.openError(Display.getCurrent().getActiveShell(), GUITexts
                .get(Labels.DESTOCK_PROPOSAL_ERROR_TITLE), GUITexts.get(Labels.DESTOCK_PROPOSAL_ERROR_TEXT));
    }
}

private String[] getAllProposals(final Widget widget, final String text) {
    List<String> proposals = new ArrayList<String>();
    if (text == null || text.length() == 0) {
        proposals = null;
    } else {
        if (widget instanceof Text) {
            for (final Workorder wo : this.openWorkorders) {
                if (wo.getWorkorderId().toString().startsWith(text)) {
                    proposals.add(wo.getWorkorderId().toString());
                }
            }
        } else if (widget instanceof Combo) {
            for (final Workorder wo : this.openWorkorders) {
                if (wo.getDescription().startsWith(text)) {
                    proposals.add(wo.getDescription());
                }
            }
        }
    }

    String[] result = null;
    if (proposals != null) {
        result = new String[proposals.size()];
        for (int i = 0; i < result.length; i++) {
            result[i] = proposals.get(i);
        }
    } else {
        result = new String[0];
    }
    return result;
}

1 个答案:

答案 0 :(得分:1)

首先感谢您的代码。我正在寻找这样的东西,我已经实现了它。 当我这样做时,我遇到了和你一样的问题。我猜它与ModifyEvent行为有关。我只是将其更改为在keyPressed事件上启动,现在它完美运行。