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.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 のコメントを読んだことがあると思います。ある OS で動作するようにしたとしても、別の OS では動作しない可能性があります。ハックが多すぎます。

SWT でサポートされているソリューションは、透明なウィンドウを重ね合わせることです。しかし、これは実装するのも非常に難しく (サイズ変更、移動、常に最前面、アーティファクトの再描画)、おそらく他の回避策と同じくらい大きなハックです。リスナーに行きます。

于 2010-02-06T15:00:12.917 に答える