Eclipse SWT:如何以编程方式滚动文本

时间:2015-10-15 19:30:43

标签: java scroll eclipse-rcp

我在shell上有一个Text控件

Text text = new Text(contentComp, SWT.NONE | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);

其文本值将由后台线程设置。例如,线程可能会向Text附加1000行。我想让文本在其内容更新时自动在垂直滚动条上滚动。我试图在其Modify事件监听器中设置选择,但它不起作用。知道怎么做吗?我无法使用StyledText,因此没有可用的setTopIndex方法。感谢。

2 个答案:

答案 0 :(得分:0)

这是一种可以按代码滚动(RAP)文本小部件的变通方法。但它有局限性。我不确定这个问题是否有一个很好的解决方案。以下是解决方法:使用ScrolledComposite作为Text小部件的父级。

ScrolledComposite sc = new ScrolledComposite(parent, SWT.NONE|SWT.V_SCROLL);
Text text = new Text(sc, SWT.NONE|SWT.MULTI);

重点是在附加新数据时更新ScrollableComposite#setMinHeight(int)。如果在修改侦听器中完成此操作,则当文本大小变得大于父级上的默认值时,sc和text都会显示滚动条。它看起来有点奇怪,但只要正确更新了setMinHeight(int),就可以调用

sc.setOrigin(sc.getOrigin().x, Integer.MAX_VALUE);

将文本向下滚动到底部。

此解决方法的另一个问题是,如果您需要处置控件并稍后使用之前附加的数据重新创建它们,则自动滚动将不再起作用,因为文本将调整大小以适应sc因此sc minHeight无法滚动。

答案 1 :(得分:0)

我无法使用ScrolledComposite来获得解决方案。输出已写入Text字段,但我看不到。就像ScrolledComposite正在隐藏文本。

相反,我可以像这样工作:

Text outputText = new Text(parent, SWT.NONE | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
outputText.addModifyListener(new ModifyListener() {
    @Override
    public void modifyText(ModifyEvent event) {
        Text text = (Text) event.widget;
        // position the cursor after the last character
        text.setSelection(text.getCharCount());
    }
});