Tabキーを使用してテーブルのジャンプを実現

3287 ワード

ExcelでTabキーを押すと、隣接する四角形にフォーカスがジャンプします.
 
SFTのTableまたはTable Treeでは、デフォルトでは、Tabキーによるジャンプはサポートされていません.このような機能を実現できれば、かっこいいのではないでしょうか.
 
はい、ここでこの方法の実装を教えてあげます.EditingSupportを使うと、この機能を簡単に実現することができます.
 
ここでは、ツリーテーブルを実装し、このツリーテーブルには少なくともSWTが含まれる必要があると仮定します.FULL_SELECTIONのスタイル.要求はFullを含むSelectionの様子は主に便利さを実現するためで、full_selectionスタイルは、マウスが任意の場所でテーブルを選択することをサポートします.そうしないと、選択された行のテーブルのみが選択されます.
 
このツリーがEditingSupportを追加することで編集サポートが実現した場合.次に、Tabキーのジャンプを実現し、以下のように実現する.
 
アイデア:マウスをクリックすることで、CellEditorを簡単に出現させることができるので、Tabを実現するには、マウスクリックイベントをシミュレートすることで実現することができます.SFTでは、2つのシミュレーションイベントを実装する方法があり、1つはDisplayのpost()メソッドによって実装され、もう1つはwidgetのnotifyListener()メソッドによって実装される.ここで私が使うnotifyListener()です.
 
まずCellEditorのControlにリスニングを追加します.次のようにします.
cellEditor.getControl().addTraverseListener(this);

 
ここではEditingSupportがTraverseListenerを実現したことを覚えています.以下のようにします.
class FileEditingSupport extends EditingSupport implements TraverseListener

 
最後に、マウスイベントをシミュレートするためのkeyTraverse()メソッドを実装します.
 
	public void keyTraversed(TraverseEvent e) {
		if(e.character!=SWT.TAB){
			return;
		}
		Rectangle bound = cellEditor.getControl().getBounds();
		Tree tree = (Tree) getViewer().getControl();
		
		int x = bound.x+bound.width+2;
		int y = bound.y;
		if(index==tree.getColumnCount()-1){
			x = tree.getColumn(0).getWidth()-2;
			y = y+bound.height+2;
		}
		
		Event origin = new Event();
		origin.widget = tree;
		origin.x = x;
		origin.y = y;
		origin.display = tree.getDisplay();
		origin.time = e.time;
		origin.count = 1;
		origin.type = SWT.MouseDown;
		origin.button = 1;
		
		tree.notifyListeners(SWT.MouseDown, origin);
	} 

 
普通のTextCellEditorやComboCellEditorであれば問題ありません.しかし、DialogCellEditorがあれば、機能しないことに気づきます.これはDialogCellEditorのcontrolがCompositeであるため、焦点を当てたのはこのCompositeのButtonであり、ここでTabを押すと、Buttonが次のCompositeではなくイベントの傍受を受けてイベントを得るからである.DialogCellEditorにもこの機能を持たせるためには、もう少し多くのことをしなければなりません.
 
構想:やはりイベントシミュレーションで、button上のイベントをcontrolに転送します.
 
実装は、主にイベントのジャンプを実装するために抽象的なDialogCellEditorクラスを書きます.
 
public abstract class TraverseDialogCellEditor extends DialogCellEditor implements
		TraverseListener {

	public TraverseDialogCellEditor() {
		super();
	}

	public TraverseDialogCellEditor(Composite parent, int style) {
		super(parent, style);
	}

	public TraverseDialogCellEditor(Composite parent) {
		super(parent);
	}

	@Override
	protected Button createButton(Composite parent) {
		Button button = super.createButton(parent);
		button.addTraverseListener(this);
		return button;
	}

	public void keyTraversed(TraverseEvent e) {
		Event event = new Event();
		event.time = e.time;
		event.character = e.character;
		getControl().notifyListeners(SWT.Traverse, event);
	}

}

 
buttonにTraverseListenerを追加し、すべてのイベントをコントロールに移動します.
 
OKです.効果を試してもいいですよ!