扩展Item后,在ExpandBar上将Focus放到ExpandItem上

时间:2014-08-12 08:00:15

标签: java swt

我在StyledText上有一个ExpandItem小工具,此ExpandItem属于ExpandBar

如果展开setFocus(),我想StyledText ExpandItem

我尝试在ExpandListener中执行此操作,但事实证明,在itemExpanded()方法中,ExpandItem尚未展开,因此我无法将焦点放在{ {1}}小工具。

我还尝试通过

StyledText方法中手动展开项目
itemExpanded()

但它也不起作用。

1 个答案:

答案 0 :(得分:2)

似乎在项目完全展开之前触发了ExpandListener s itemExpanded()方法。

因此,强制关注StyledText失败。

但是,这个问题有一个简单的解决方法。您可以使用Runnable并使用Display#asyncExec(Runnable)启动它。这将为项目留出足够的时间来实际显示StyledText

private static Map<ExpandItem, StyledText> mapping = new HashMap<>();

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

    final ExpandBar bar = new ExpandBar(shell, SWT.V_SCROLL);

    for (int i = 0; i < 3; i++)
        addExpandItem(bar, i);

    bar.addExpandListener(new ExpandListener()
    {
        @Override
        public void itemExpanded(ExpandEvent e)
        {
            ExpandItem item = (ExpandItem) e.item;

            expandItem(mapping.get(item));
        }

        @Override
        public void itemCollapsed(ExpandEvent e)
        {

        }
    });

    Button button = new Button(shell, SWT.PUSH);
    button.setText("Expand first");
    button.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            expandItem(bar.getItem(0));
        }
    });

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

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

private static void expandItem(ExpandItem item)
{
    ExpandBar bar = item.getParent();

    item.setExpanded(true);
    Event e = new Event();
    e.item = item;
    bar.notifyListeners(SWT.Expand, e);
}

private static void expandItem(final StyledText text)
{
    if (text != null && !text.isDisposed())
    {
        Display.getDefault().asyncExec(new Runnable()
        {
            @Override
            public void run()
            {
                if (text != null && !text.isDisposed())
                {
                    text.setFocus();
                    text.forceFocus();
                }
            }
        });
    }
}

private static void addExpandItem(ExpandBar bar, int i)
{
    ExpandItem item = new ExpandItem(bar, SWT.NONE);
    item.setText("Item " + i);

    Composite content = new Composite(bar, SWT.NONE);
    content.setLayout(new FillLayout());

    final StyledText text = new StyledText(content, SWT.BORDER);
    item.setControl(content);
    item.setHeight(content.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);

    mapping.put(item, text);
}