【问题标题】:SWT editable Combo - highlight textSWT 可编辑组合 - 突出显示文本
【发布时间】:2014-04-04 03:15:09
【问题描述】:

我有一个可编辑的 SWT 组合。用户可以从下拉列表中选择一个项目或输入新文本。我的代码还进行了一些数据验证,如果输入的文本无效,我想强制焦点到 Combo 并突出显示输入的文本。

我的问题是:有没有办法突出显示 Combo 中所有输入的文本?不幸的是,我认为没有“selectText”方法......

提前致谢。

我尝试了 Baz 的建议,但由于某些未知原因,代码在单独的测试项目中运行时,相同的代码在我的程序中不起作用:

    comboViewerRes = new ComboViewer(this, SWT.DROP_DOWN);
    comboRes = comboViewerRes.getCombo();
    comboRes.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
            1, 1));

    comboRes.addListener(SWT.KeyUp, new Listener() {
        @Override
        public void handleEvent(Event e) {
            if (e.keyCode == SWT.SPACE) {
                Rectangle bounds = comboRes.getBounds();
                Point point = new Point(bounds.x, bounds.x + bounds.width);
                System.out.println(point);
                comboRes.setSelection(point);
            }
        }
    });

【问题讨论】:

  • 发布您尝试使用的代码。有人会纠正它并回答

标签: java swt


【解决方案1】:

好的,没有直观的方法可以做到这一点,但是,Combo 包含一个名为 setSelection(Point) 的方法。该方法的 javadoc 说明:

将接收者的文本字段中的选择设置为由参数指定的范围,该参数的 x 坐标是选择的开始,其 y 坐标是选择的结束。

为了选择一切,您需要创建一个Point,将其x 值设置为Combo 的左边缘,并将y 坐标设置为Combo 的右边缘。

这是一个代码示例:

public static void main(String[] args)
{
    final Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    shell.setText("ExpandBar Example");

    final ComboViewer viewer = new ComboViewer(shell, SWT.DROP_DOWN);

    viewer.getCombo().addListener(SWT.KeyUp, new Listener()
    {
        @Override
        public void handleEvent(Event e)
        {
            if(e.keyCode == SWT.SPACE)
            {
                Rectangle bounds = viewer.getCombo().getBounds();
                Point point = new Point(bounds.x, bounds.x + bounds.width);
                viewer.getCombo().setSelection(point);
            }
        }
    });

    viewer.setContentProvider(ArrayContentProvider.getInstance());
    viewer.setLabelProvider(new LabelProvider()
    {
        @Override
        public String getText(Object element)
        {
            if (element instanceof String)
            {
                return element.toString();
            }
            return super.getText(element);
        }
    });

    String[] persons = new String[] { "this", "is", "a", "test" };

    viewer.setInput(persons);

    shell.pack();
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
        {
            display.sleep();
        }
    }
    display.dispose();
}

您可以正常输入。一旦你按下 空格,代码将选择到目前为止输入的所有内容。

以下是一些截图:

【讨论】:

  • 代码本身运行良好。但是,相同的代码在我使用 ComboViewer 的代码中不起作用。我尝试了Combo combo = comboViewer.getCombo();,然后按照您的建议添加了侦听器 - 运行时没有发生任何事情。 combo.setSelection 行实际上已运行(我放了一个System.out.println(bounds); 来确认。我不确定为什么它在我的程序中不起作用。这可能是 ComboViewer 的“功能”吗?
  • @user3229864 好吧,您没有在问题中指定您使用的是ComboViewer 而不是Combo。我会调查的。
  • @user3229864 更新了代码。它现在使用ComboViewer。相同的代码仍然可以正常工作。
  • 这很奇怪。您的代码工作正常,但是当我将代码复制到我的程序中时,它没有任何效果。 boundspoint 似乎已正确设置,但 setSelection 方法似乎根本没有做任何事情。
  • @user3229864 你能检查一下组合的样式位是否相同?
【解决方案2】:

实际上,我发现combo.setSelection() 应该以文本字符串的起始索引作为第一个参数,第二个参数作为结束索引的点,即选择文本中的前两个字符, combo.setSelection(new Point(0,2)); 并选择所有文本做combo.setSelection(new Point(0, combo.getText().length()));

为什么它适用于 Baz 而不是 user3229864,这可能是因为 Baz 的组合在坐标 0 上,而 user3229864 不在。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2015-05-25
    相关资源
    最近更新 更多