我在 ExpandItem
上有一个 StyledText
小部件,并且此 ExpandItem
属于 ExpandBar
。
如果 ExpandItem
展开,我想将 setFocus()
设置为 StyledText
。
我尝试在 ExpandListener
中执行此操作,但事实证明,在 itemExpanded()
方法中,ExpandItem
尚未展开因此我无法将焦点赋予 StyledText
小部件。
我还尝试通过 itemExpanded()
方法手动扩展 Item
item.setExpanded(true);
bar.layout();
但它也不起作用。
最佳答案
看起来 ExpandListener
的 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);
}
关于java - 展开 Item 后将焦点集中到 ExpandBar 上的 ExpandItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25259071/