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にリスニングを追加します.次のようにします.
ここではEditingSupportがTraverseListenerを実現したことを覚えています.以下のようにします.
最後に、マウスイベントをシミュレートするためのkeyTraverse()メソッドを実装します.
普通のTextCellEditorやComboCellEditorであれば問題ありません.しかし、DialogCellEditorがあれば、機能しないことに気づきます.これはDialogCellEditorのcontrolがCompositeであるため、焦点を当てたのはこのCompositeのButtonであり、ここでTabを押すと、Buttonが次のCompositeではなくイベントの傍受を受けてイベントを得るからである.DialogCellEditorにもこの機能を持たせるためには、もう少し多くのことをしなければなりません.
構想:やはりイベントシミュレーションで、button上のイベントをcontrolに転送します.
実装は、主にイベントのジャンプを実装するために抽象的なDialogCellEditorクラスを書きます.
buttonにTraverseListenerを追加し、すべてのイベントをコントロールに移動します.
OKです.効果を試してもいいですよ!
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です.効果を試してもいいですよ!