2

JFaceの別のバグ?標準のメカニズムを使用してカスタムツールチップを実装しました:CellLabelProviderメソッドの実装getToolTipText()

すべてがうまくいくように見えますが、そうではありません。

ビューとエディターがあり、どちらもこれらのカスタムツールチップを使用してテーブルを表示しています。エディターに焦点を合わせてそのセルにカーソルを合わせると、ツールチップが表示されます。正しい。ビューのテーブルのセルにカーソルを合わせると、ツールチップが表示されます。正しい。

ただし、マウスをtooptipに移動して再度移動すると、フォーカスがエディターからビューに移動します(その逆も同様です)。

これがどういう意味なのかわかりません。それは確かに非常に気が散る。

誰かがこれを見たことがありますか?そうでない場合は、試してみてください!

再現するには、 JFaceSnippets3.11から取得したこのスニペットを取得します。

package org.eclipse.jface.snippets.viewers;

import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * Explore New API: JFace custom tooltips drawing.
 * 
 * @author Tom Schindl <tom.schindl@bestsolution.at>
 * @since 3.3
 */
public class Snippet011CustomTooltips {
    private static class MyContentProvider implements IStructuredContentProvider {
        @Override
        public Object[] getElements( final Object inputElement ) {
            return new String[] { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
        }

        @Override
        public void dispose() {
        }

        @Override
        public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) {
        }
    }

    /**
     * @param args
     */
    public static void main( final String[] args ) {
        final Display display = new Display();
        final Shell shell = new Shell( display );
        shell.setLayout( new FillLayout( SWT.VERTICAL ) );

        final Text t = new Text( shell, SWT.MULTI );
        t.setText( "1) Make sure focus is somewhere here. See the blinking caret!\n"
                + "2) Now get a tooltip displayed in the table by hovering there with the mouse cursor\n"
                + "3a) If you move the cursor INSIDE the tooltip just shortly and out again, the input focus will be stolen from this text field\n"
                + "3b) If you DO NOT move the cursor INSIDE the tooltip, input focus will remain with the text edit field\n\n"
                + "=> to me, this is a bug!" );

        final TableViewer v = new TableViewer( shell, SWT.FULL_SELECTION );
        v.getTable().setLinesVisible( true );
        v.getTable().setHeaderVisible( true );
        v.setContentProvider( new MyContentProvider() );
        ColumnViewerToolTipSupport.enableFor( v, ToolTip.NO_RECREATE );

        final CellLabelProvider labelProvider = new CellLabelProvider() {
            @Override
            public String getToolTipText( final Object element ) {
                return "Tooltip (" + element + ") - if you move HERE, the table will grab input focus!";
            }

            @Override
            public void update( final ViewerCell cell ) {
                cell.setText( cell.getElement().toString() );
            }
        };

        final TableViewerColumn column = new TableViewerColumn( v, SWT.NONE );
        column.setLabelProvider( labelProvider );
        column.getColumn().setText( "Table" );
        column.getColumn().setWidth( 100 );

        v.setInput( "" );

        shell.setSize( 800, 400 );
        shell.open();

        while( !shell.isDisposed() ) {
            if( !display.readAndDispatch() ) {
                display.sleep();
            }
        }

        display.dispose();
    }

}
4

1 に答える 1

1

この動作は非常に奇妙であり、私はこれをバグと呼んでいます。ツール ヒント ラベルが破棄されたという理由だけで、基になるテーブルにフォーカスを移動しても、明らかな意味はありません。

この問題は、次のColumnViewerToolTipSupport.afterHideToolTip()方法によって発生します。

protected void afterHideToolTip(Event event) {
    super.afterHideToolTip(event);

    // Clear the restored value else this could be a source of a leak
    setData(VIEWER_CELL_KEY, null);
    if (event != null && event.widget != viewer.getControl()) {
        viewer.getControl().setFocus();
    }
}

ツール ヒントにマウスを合わせずに、カーソルを合わせているセルから離れただけでは、渡されたイベントafterHideToolTip()は null になり、setFocus()呼び出しは行われません。

ツール ヒントにマウスを移動してから離すと、渡されたイベントafterHideToolTip()はツール ヒントのラベル自体によって生成されたように見えます。

自由に使えるいくつかのパラメーターをいじっても、動作に影響はありませんでした: true を返し、 ...の代わりにuseNativeToolTips()渡します。RECREATENO_RECREATE

テーブルビューアーの参照にはプライベートアクセスがあるため、サブクラス化ColumnViewerToolTipSupportしてオーバーライドし、その不思議な呼び出しをafterHideToolTipEvent()削除することさえできません。setFocus()ColumnViewerToolTipSupport.viewer

私が見ることができる唯一の行動は、バグを報告し、JFace 開発者からアドバイスを得ることができるかどうかを確認することです。setFocus()その呼びかけの背後にある考え方を知りたいと思います。

于 2013-02-21T15:01:11.310 に答える