gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:33:41 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com