SWT 创建两个串联滚动的样式文本

SWT Create Two StyledText That Scroll In Tandem

我必须创建两个串联滚动的 StyledText,我得到的只是使用 ScrolledComposites 创建相同内容的代码。我对 StyledText 的使用有限制,因为我也将它用于其他目的。 我想创建相同的东西 link here 但使用 StyledText.

我尝试用相同的代码将 ScrolledComposites 替换为 StyledText 但它不允许我 setOrigin(x , y)

您可以使用方法 StyledText#setHorizontalPixel()StyledText#setTopPixel()(以及它们各自的 get 方法)来获取和设置位置:

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

    StyledText one = new StyledText(shell, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
    StyledText two = new StyledText(shell, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);

    one.setAlwaysShowScrollBars(true);
    two.setAlwaysShowScrollBars(true);

    one.setText("Scroll scroll scroll\ndown down down\nto to to\nsee see see\nthe the the\nstyled styled styled\ntexts texts texts\nscroll scroll scroll\nin in in\ntandem tandem tandem");
    two.setText("Scroll scroll scroll\ndown down down\nto to to\nsee see see\nthe the the\nstyled styled styled\ntexts texts texts\nscroll scroll scroll\nin in in\ntandem tandem tandem");

    handleVerticalScrolling(one, two);
    handleHorizontalScrolling(one, two);

    shell.pack();
    shell.setSize(200, 100);
    shell.open();

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

private static void handleHorizontalScrolling(StyledText one, StyledText two)
{
    ScrollBar hOne = one.getHorizontalBar();
    ScrollBar hTwo = two.getHorizontalBar();

    hOne.addListener(SWT.Selection, e -> {
        int x = one.getHorizontalPixel();
        two.setHorizontalPixel(x);
    });
    hTwo.addListener(SWT.Selection, e -> {
        int x = two.getHorizontalPixel();
        one.setHorizontalPixel(x);
    });
}

private static void handleVerticalScrolling(StyledText one, StyledText two)
{
    ScrollBar vOne = one.getVerticalBar();
    ScrollBar vTwo = two.getVerticalBar();

    vOne.addListener(SWT.Selection, e ->
    {
        int y = one.getTopPixel();
        two.setTopPixel(y);
    });
    vTwo.addListener(SWT.Selection, e ->
    {
        int y = two.getTopPixel();
        one.setTopPixel(y);
    });
}