-1

ユーザーがテーブルから行を選択できるようにする がありますTitleAreaDialogTableViewer問題は、テーブルの内容が時間の経過とともに変化する可能性があることです。ブラウザーで一般的に見られる更新動作を実装したいと思います (たとえばF5、テーブルのコンテンツを押して更新する必要があります)。

以下は、うまくいけばシナリオをもう少し明確にするスクリーンショットです。

この質問には解決策があるようですが、いくつかの理由で問題があると思います。

  • リスナーが適切に切り離されていません (たとえば、ダイアログを再度開いた場合、 に 2 つのフィルターがありますDisplay) 。
  • アーキテクチャの観点から、リスナーが属していると思われる場所にTitleAreaDialogリスナーを追加することはありません。Widget
  • 手動でリスナーをアタッチ/デタッチすることは避けたいです (たとえば、リスナーは と一緒に破棄する必要がありますTitleAreaDialog) 。

簡単に言えば、前述の質問で説明されているように、フィルターメカニズムを使用せずに(または 一般的に) KeyListeneraを追加する適切な方法は何ですか?TitleAreaDialogDialog

この質問がSSCCE部門で多少失敗することはわかっていますが、正しい方向への指針は高く評価されます。

TableViewerとの対話

4

1 に答える 1

1

キー イベントに を追加するのListenerは難しいことです。Listener含まれているControlのいずれにもフォーカスがないときに を起動し、 の子にフォーカスがある場合でも起動したいDialog

この問題には基本的に 2 つの解決策があります。

  1. 明らかな選択:が作成されたとき、およびaddFilterダイアログが閉じられたときに使用します ( で)。DialogremoveFilterclose()
  2. Listenerforを作成し、のすべての子にSWT.KeyUp追加します。これは、イベントがフォーカス コントロールとは無関係に発生するために必要です。Dialog

私は解決策 1 を好みます。これは、混乱が少なく、SWT がすべてを処理してくれるからです (フィルターの追加と削除を除く)。すべての子コントロールにa を追加するListenerことは、実際にすべきことではありませんが、同様に機能します。


フィルターを毎回追加および削除したくない場合は、サブクラスを作成するDialogTitleAreaDialog、一度それを行い、再度サブクラス化して再利用します。

フィルターの追加と削除が一般的に面倒すぎる場合は、もっと簡単な解決策がないのではないかと思います。

于 2014-03-10T11:33:14.657 に答える