TableViewerのフィールド間のタブ
質問
私がやりたいのは、テーブルの要素間のタブができることです。
私は現在、このようなテーブルを作成しています。
this.tableViewer =
new TableViewer(parent , SWT.FULL_SELECTION);
tableViewer.setUseHashlookup(true);
table = tableViewer.getTable();
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
...
/** Create the Cell Editor Array - will hold all columns **/
editors = new CellEditor[table.getColumnCount()];
/** Cell Editor Row 1 **/
/** Set the column properties **/
tableViewer.setColumnProperties(columnNames);
/** Assign the cell editors to the viewer **/
tableViewer.setCellEditors(editors);
/** Set the cell modifier for the viewer **/
tableViewer.setCellModifier(new MyCellModifier(this));
//Create the Table Viewer
/** Table Viewer Content and Label Provider **/
tableViewer.setContentProvider(new MyContentProvider(this));
tableViewer.setLabelProvider(new MyLabelProvider());
しかし、集計のセットアップ方法はわかりません。他のすべては、列を編集し、データなどを表示する限り機能します。
明らかなドキュメンテーションやJavadocsを逃した場合 - 私の謝罪であり、それらを指摘することさえ素晴らしいことです。
解決
デフォルトのタブは、SWTテーブルのセルからセルへとジャンプしないと思います。代わりに、次のコントロールに移動します。したがって、タブが押されたときにトラバースしないように言う必要があります
KeyListener keyListener = new KeyLisener()
{
public void keyPressed(KeyEvent evt)
{
if (evt.keyCode == SWT.TAB)
{
// There are numerous setSelection methods. I'll leave this to you.
tableViewer.getTable().setSelection(...)
}
}
public void keyReleased(KeyEvent evt){}
}
TraverseListener traverseListener = new TraverseListener()
{
public void keyTraversed(TraverseEvent evt)
{
if (evt.keyCode == SWT.TAB)
evt.doit = false;
}
}
tableViewer.getTable().addKeyListener(keyListener);
tableViewer.getTable().addTraverseListener(traverseListener);
また、Derbiggiが示唆したように、リスナーはTableViewerではなく、テーブルオブジェクトに追加する必要があります。
他のヒント
解決策ですが thehiatus 投稿された投稿は非常に低レベルで、おそらく機能します(テストしていません)。JFaceは、この特定の問題のフレームワークを提供します。を参照してください org.eclipse.jface.viewers.TableViewerFocusCellManager
一緒に org.eclipse.jface.viewers.CellNavigationStrategy
この問題を解決するクラス。
私はaで望ましい動作を得ることができませんでした TraverseListener
(それはテーブル内で通過しません)、そして私はそれを一緒に動作させるのに苦労しました FocusCellManager
と CellNavigationStrategy
. 。ついに、このソリューションを見つけました。このソリューションは、列から列への列へのタブを列に並べて、エディターを自動的にアクティブにすることができます。
Viewer viewer = ...
TableViewerFocusCellManager focusCellManager =
new TableViewerFocusCellManager(
viewer,
new FocusCellHighlighter(viewer) {});
ColumnViewerEditorActivationStrategy editorActivationStrategy =
new ColumnViewerEditorActivationStrategy(viewer) {
@Override
protected boolean isEditorActivationEvent(
ColumnViewerEditorActivationEvent event) {
ViewerCell cell = (ViewerCell) event.getSource();
return cell.getColumnIndex() == 1 || cell.getColumnIndex() == 2;
}
};
TableViewerEditor.create(viewer, focusCellManager, editorActivationStrategy,
TableViewerEditor.TABBING_HORIZONTAL);
KeyListenerを追加し、選択またはフォーカスを次のセルに設定する必要があります。
tableViewer.getTable().addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e) {
System.out.println("Key Pressed");
if (e.keycode == SWT.TAB)
{
System.out.println("Detected TAB key");
// set table viewer selection
}
}
public void keyReleased(KeyEvent e) {
System.out.println("Key Released");
}}
);