2017-04-13 14 views
1

私はJFaceのCheckBoxTreeViewerを使用しています。CheckBoxTreeViewerでは、アイテムのチェック/チェックを解除する方法も選択できますか?

ユーザーがアイテムのテキストをクリックすると、ツリー内や同じドキュメントのプレゼンテーションの他の場所で選択されます。これは望ましい動作です。

ユーザーがチェックボックスをクリックするだけで、少なくともWindowsとMacの実装ではツリー項目も選択されています。上記の望ましい動作のため、現在の選択が置き換えられます。

私は現在の選択を置き換えずにツリー内のアイテムをオン/オフできるようにしたいと思います。 check/uncheckingがツリー項目も選択しないようにCheckBoxTreeViewerを設定する方法はありますか?あるいは、その動作はOS特有のルック・アンド・フィールの一部にすぎませんか?

+1

、SWT.MULTI ')、チェックボックスをクリックしてもアイテムは選択されず、前の選択が保持されます。記述した動作を示す[MCVE](https://stackoverflow.com/help/mcve)がありますか? –

+0

@LorisSecuro - 私はその例を試してみて、SWT.MULTIを追加しなくても、あなたが記述した動作を取得しました。非常に有益なご意見ありがとうございます。あなたの例は十分です。今私は、例と私たちのケースで何が違うのかを見ることができます。一つの違いは、私がRCPで走っていることです。それがまだ問題なのかどうかはわかりません。ありがとう! –

+0

@LorisSecuro - ありがとうございます。私のコードでは、観察された振る舞いがデフォルトと異なる2つの問題が発生しました。問題の1つが他の人に影響を与える可能性があるので、答えとして投稿しました。 –

答えて

0

私が見ていた動作は、デフォルトまたはネイティブの動作ではありませんでした。 @ LorisSecuroのコメントとこれを明確にする例に感謝します。

2つの問題が見つかりました。

最初は私のせいでした。 ICheckStateListenerでは、私はいくつかのコードを見逃していました...選択を設定してください。

第2の問題は、他人が遭遇する可能性のある問題でした。 CheckboxTreeViewerは、が変更されていなくても、ユーザーがのアイテムをチェック/チェック解除したときに、私のISelectionChangedListenerと呼んでいました。私はISelectionChangedListenerが呼び出されたので、選択が変更されたと推測し、選択をツリーの外に設定しました。

MySelectionChangedListener.selectionChanged(SelectionChangedEvent event) 
... 
CheckboxTreeViewer(Viewer).fireSelectionChanged(SelectionChangedEvent) line: 160  
CheckboxTreeViewer(StructuredViewer).updateSelection(ISelection) line: 2197 
CheckboxTreeViewer(StructuredViewer).handleSelect(SelectionEvent) line: 1228  
CheckboxTreeViewer.handleSelect(SelectionEvent) line: 291 
StructuredViewer$4.widgetSelected(SelectionEvent) line: 1257  
OpenStrategy.fireSelectionEvent(SelectionEvent) line: 242 
... 

解決策は簡単でした。私は選択を追跡し、ISelectionChangedListenerで何かをする前に実際に変更されていることを確認します。 `[このプログラム例](http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/DemonstratesCheckboxTreeViewer.htm)を使用して(およびスタイルを追加のWindows 10では

@Override 
public void selectionChanged(SelectionChangedEvent event) { 
    ITreeSelection treeSelection = m_treeViewer.getStructuredSelection(); 
    List<?> newSelection = treeSelection.toList(); 

    if (! m_lastKnownSelection.equals(newSelection)) { 
    ... 
    m_lastKnownSelection = newSelection; 
    } 
} 
関連する問題