使用SWT.NO_BACKGROUND重新绘制复合后面的控件

时间:2010-02-05 13:24:03

标签: swt composite redraw

原始目标:

我有一个用于显示菜单的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中。

但是这导致了一个无限循环,并没有解决问题。

问题

有没有人知道我们如何才能实现我们的原始目标?

有谁知道我们如何才能使我们提出的解决方案有效?

1 个答案:

答案 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支持的解决方案是在彼此之上具有透明窗口。但这也很难实现(调整大小,移动,总是在顶部,重绘工件),并且可能与其他解决方法一样大。去听众。