【问题标题】:How to enable content proposal in NatTable TextCellEditor?如何在 NatTable TextCellEditor 中启用内容提议?
【发布时间】:2016-01-10 02:47:02
【问题描述】:

我目前正在寻找 Nattable TextCellEditor 中的内容辅助功能。我找到了通过扩展 Nattable TextCellEditor 来附加 ContentProposalAdapter 和 IContentProposalProvider 的方法。但是,从建议列表中选择的值不会在文本控件中更新。

片段:

@Override

protected Text createEditorControl(final Composite parent, final int  Style) {
this.textControl = super.createEditorControl(parent, style);

  contentProposalAdapter =
      new ContentProposalAdapter(this.textControl, new TextContentAdapter(), contentProposalProvider, keyStroke,
          null);


  contentProposalAdapter.addContentProposalListener(new IContentProposalListener() {

    @Override
    public void proposalAccepted(IContentProposal proposal) {
    System.out.println(proposal.getContent());

    }

  });
}

【问题讨论】:

    标签: eclipse-rcp jface nattable


    【解决方案1】:

    您遇到的问题是在弹出窗口中选择值时触发的内部 FocusListener。要添加支持,您还需要使用在内容提议弹出窗口打开时不会触发的侦听器覆盖内部 FocusListener。

    一个例子是添加一个布尔标志,指示弹出窗口已打开,并添加一个相应地设置标志的侦听器。

    private boolean popupOpen = false;
    ...
    contentProposalAdapter.addContentProposalListener(new IContentProposalListener2() {
    
            @Override
            public void proposalPopupClosed(ContentProposalAdapter adapter) {
                this.popupOpen = false;
            }
    
            @Override
            public void proposalPopupOpened(ContentProposalAdapter adapter) {
                this.popupOpen = true;
            }
    });
    

    然后在处理该标志的构造函数中实现并设置一个 FocusListener。

    this.focusListener = new FocusAdapter() {
            @Override
            public void focusLost(FocusEvent e) {
                if (!TextCellEditor.this.popupOpen) {
                    if (!commit(MoveDirectionEnum.NONE, true)) {
                        if (e.widget instanceof Control && !e.widget.isDisposed()) {
                            ((Control) e.widget).forceFocus();
                        }
                    } else {
                        if (!TextCellEditor.this.parent.isDisposed())
                            TextCellEditor.this.parent.forceFocus();
                    }
                }
            }
    };
    

    如果值在选择后应该立即提交,则需要添加一个侦听器,在选择后执行提交。

    contentProposalAdapter.addContentProposalListener(new IContentProposalListener() {
    
            @Override
            public void proposalAccepted(IContentProposal proposal) {
                commit(MoveDirectionEnum.NONE);
            }
    });
    

    很遗憾,AbstractCellEditor#InlineFocusListener 是私有的,因此无法扩展。

    随时为 NatTable 提交增强票证,以引入轻松将内容建议添加到文本单元格编辑器的功能。

    https://bugs.eclipse.org/bugs/enter_bug.cgi?product=NatTable

    【讨论】:

    • 太棒了! .非常感谢您的快速支持。我将提交增强票证。
    • 在这种情况下,最好接受我的回答为正确的。
    • 实现 IContentProposalListener2() 以及您提到的 FocusListener 实现是有效的。另一种选择,实现 IContentProposalListener() 不起作用。
    • 另一个选项,实现 IContentProposalListener() 不起作用,因为在提案弹出窗口中选择内容时方法 proposalAccepted () 不会收到通知,因为它适用于 JFace TextCellEditor .
    • 我在 NatTable 目标中测试了上述代码,该目标基于 Luna 目前的开发状态。 IContentProposalListener 在那里工作正常。您使用的是哪个平台?
    猜你喜欢
    • 2014-05-03
    • 2020-11-09
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多