Java EclipseSWT:如何以编程方式滚动文本

Java EclipseSWT:如何以编程方式滚动文本,java,scroll,eclipse-rcp,Java,Scroll,Eclipse Rcp,我在shell上有一个文本控件 Text text = new Text(contentComp, SWT.NONE | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 它的文本值将由背景线程设置。例如,线程可能会向文本追加1000行。我想让文本在其内容更新时自动在垂直滚动条上滚动。我试图在其修改事件侦听器中设置选择,但它不起作用。你知道怎么做吗?我无法使用StyledText,因此没有可用的setTopIndex方法。谢谢。这是一个可以通过代码滚动(RAP

我在shell上有一个文本控件

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

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

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

ScrolledComposite sc = new ScrolledComposite(parent, SWT.NONE|SWT.V_SCROLL);
Text text = new Text(sc, SWT.NONE|SWT.MULTI);
要点是在添加新数据时更新ScrollableComposite#setMinHeight(int)。如果这是在modify listener中完成的,那么当文本大小大于其父级上的默认值时,sc和text都会显示一个滚动条。这看起来有点奇怪,但只要setMinHeight(int)更新正确,调用

sc.setOrigin(sc.getOrigin().x, Integer.MAX_VALUE);
将文本向下滚动至底部


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

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

ScrolledComposite sc = new ScrolledComposite(parent, SWT.NONE|SWT.V_SCROLL);
Text text = new Text(sc, SWT.NONE|SWT.MULTI);
要点是在添加新数据时更新ScrollableComposite#setMinHeight(int)。如果这是在modify listener中完成的,那么当文本大小大于其父级上的默认值时,sc和text都会显示一个滚动条。这看起来有点奇怪,但只要setMinHeight(int)更新正确,调用

sc.setOrigin(sc.getOrigin().x, Integer.MAX_VALUE);
将文本向下滚动至底部


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

我无法使用
ScrolledComposite
获得解决方案。输出正在写入
文本
字段,但我看不到它。这就像是
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());
    }
});

我无法使用
ScrolledComposite
获得解决方案。输出正在写入
文本
字段,但我看不到它。这就像是
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());
    }
});

Text
还有一个
setTopIndex()
方法。感谢您的回复。我使用EclipseRAP平台提供的SWT库。它与标准SWT库非常相似,但偶尔也会有所不同。RAP平台上的文本没有setTopIndex()方法。如果您正在使用RAP,则应使用
eclipse RAP
标记文章。如果
setSelection()
不起作用,则很可能是RAP中的错误,您可以提交一个文件。请确保您尝试了最新版本。
Text
还有一个
settopinex()
方法。感谢您的回复。我使用EclipseRAP平台提供的SWT库。它与标准SWT库非常相似,但偶尔也会有所不同。RAP平台上的文本没有setTopIndex()方法。如果您正在使用RAP,则应使用
eclipse RAP
标记文章。如果
setSelection()
不起作用,则很可能是RAP中的错误,您可以提交一个文件。请确保您已尝试使用最新版本。