原始目标:
我有一个用于显示菜单的TreeMenu。 在此树中,用户可以选择不同的项目。
我想禁用树,以便用户在选择第一个后无法选择新项。 问题是,我们不能使用setEnabled,因为我们不允许使用灰色外观。外观/颜色可能不会改变。
我们建议的解决方案
我们的第一个想法是在菜单顶部使用带有SWT.NO_BACKGROUND的Composite,以防止用户与TreeMenu进行任何交互。
代码:
final Composite cover = new Composite(getPage().shell, SWT.NO_BACKGROUND);
cover.setLocation(getMenu().getLocation());
cover.setSize(getMenu().getSize());
cover.moveAbove(getMenu());
重绘时存在问题。
如果屏幕被另一个屏幕覆盖,然后再返回到前面,则封面复合材料将填充上一个重叠窗口的片段。
我们的想法是手动重绘菜单:
cover.moveBelow(getMenu());
getMenu().update();
cover.moveAbove(getMenu());
我们将代码放在paintEventListener中。
但是这导致了一个无限循环,并没有解决问题。
问题
有没有人知道我们如何才能实现我们的原始目标?
有谁知道我们如何才能使我们提出的解决方案有效?
答案 0 :(得分:3)
看看SWT-Snippet80。它显示了如何防止选择。解决问题的方法是在树中添加这样的监听器:
tree.addListener(SWT.Selection, new Listener() {
TreeItem[] oldSelection = null;
public void handleEvent( Event e ) {
Tree tree = (Tree)(e.widget);
TreeItem[] selection = tree.getSelection();
if ( oldSelection != null )
tree.setSelection(oldSelection);
else
oldSelection = selection;
}
});
我不建议尝试实施您的解决方法。我相信在SWT中不支持将透明控件放在彼此之上 - 我想我曾经读过Steve Northover对此主题的评论。即使你让它适用于某些操作系统,它也可能无法在另一个操作系统中运行 - 这太糟糕了。
SWT支持的解决方案是在彼此之上具有透明窗口。但这也很难实现(调整大小,移动,总是在顶部,重绘工件),并且可能与其他解决方法一样大。去听众。