使用SWT.NO_背景在复合材料后面重绘控件

使用SWT.NO_背景在复合材料后面重绘控件,swt,composite,redraw,Swt,Composite,Redraw,原始目标: 我有一个树,我用它来显示我的菜单。 在此树中,用户可以选择不同的项目 我想禁用该树,以便用户在选择第一个项目后无法选择新项目。 问题是,我们不能使用setEnabled,因为我们不允许使用灰显外观。外观/颜色可能不会改变 我们提出的解决方案 我们的第一个想法是在菜单顶部使用一个带有SWT.NO_背景的组合,以防止用户与TreeMenu进行任何交互 代码: 这有一个重绘的问题 如果屏幕被另一个屏幕覆盖,然后被带回到前面,则封面合成图将填充上一个重叠窗口的碎片 我们的想法是手动重新绘制菜

原始目标:

我有一个树,我用它来显示我的菜单。 在此树中,用户可以选择不同的项目

我想禁用该树,以便用户在选择第一个项目后无法选择新项目。 问题是,我们不能使用setEnabled,因为我们不允许使用灰显外观。外观/颜色可能不会改变

我们提出的解决方案

我们的第一个想法是在菜单顶部使用一个带有SWT.NO_背景的组合,以防止用户与TreeMenu进行任何交互

代码:

这有一个重绘的问题

如果屏幕被另一个屏幕覆盖,然后被带回到前面,则封面合成图将填充上一个重叠窗口的碎片

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

cover.moveBelow(getMenu());
getMenu().update();
cover.moveAbove(getMenu());
我们将代码放在paintEventListener中

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

问题

有人知道我们怎样才能实现最初的目标吗

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

请看。它显示了如何防止选择。解决此问题的一个方法是向树中添加如下侦听器:

  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支持的一个解决方案是在每个窗口的顶部都有透明的窗口。但这也很难实现(调整大小、移动、始终在顶部、重新绘制工件),而且可能与其他解决方案一样大。去找倾听者。

SWT-Snippet80,你的建议同样有效。但是,当用户单击时,“我的TabFolder”仍会闪烁。就好像它必须重新绘制页面一样。我在SelectionListener中实现了逻辑。有没有关于如何避免眨眼的建议?
  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;
     }
  });