java - 展开 Item 后将焦点集中到 ExpandBar 上的 ExpandItem

标签 java swt

我在 ExpandItem 上有一个 StyledText 小部件,并且此 ExpandItem 属于 ExpandBar

如果 ExpandItem 展开,我想将 setFocus() 设置为 StyledText

我尝试在 ExpandListener 中执行此操作,但事实证明,在 itemExpanded() 方法中,ExpandItem 尚未展开因此我无法将焦点赋予 StyledText 小部件。

我还尝试通过 itemExpanded() 方法手动扩展 Item

item.setExpanded(true);
bar.layout();

但它也不起作用。

最佳答案

看起来 ExpandListeneritemExpanded() 方法是在项目完全展开之前触发的。

因此,强制将焦点放在 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);
}

关于java - 展开 Item 后将焦点集中到 ExpandBar 上的 ExpandItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25259071/

相关文章:

java - 报告生成器 Java

java - 如何在小程序中完成java.exe进程?

java - SWT - 获取图像的实际屏幕位置

java - 如何右对齐 SWT 表格单元格中的文本?

java - Java小程序的保存状态

java - 有谁知道我在哪里可以找到 "Orto"Javascript JVM?

java - 在oracle weblogic上使用javassist

java - TableViewer jface如何进行分页?

select - 如何创建无法选择的只读 SWT 文本? (通过键盘和鼠标)

java - 如何从 TitleAreaDialog 引用 SWT View