2

最初的目标:

我有一个 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 Composite 将填充上一个重叠窗口的片段。

我们的想法是手动重绘菜单:

cover.moveBelow(getMenu());
getMenu().update();
cover.moveAbove(getMenu());

我们将代码放在paintEventListener 中。

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

问题

有谁知道我们如何实现我们的原始目标?

有谁知道我们如何使我们提出的解决方案发挥作用?

4

1 回答 1

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 关于这个主题的评论。即使你让它适用于某些操作系统,它也可能无法在另一个操作系统中运行——这太过分了。

A solution that is supported by SWT, is having transparent windows on top of each other. But that is also really hard to implement (resizing, moving, always on top, redraw artifacts) and probably as big a hack as the other workaround. Go for the listener.

于 2010-02-06T15:00:12.917 回答