gpt4 book ai didi

java - JFace 查看器钢材焦点的自定义工具提示

转载 作者:行者123 更新时间:2023-11-30 11:36:49 25 4
gpt4 key购买 nike

JFace 中的另一个错误?我使用标准机制实现了自定义工具提示:CellLabelProvider 实现了方法 getToolTipText()

一切似乎都很好,但事实并非如此。

我有一个 View 和一个编辑器,它们都显示带有这些自定义工具提示的表格。如果您聚焦编辑器并将鼠标悬停在它的单元格上,您会看到它的工具提示。正确的。如果将鼠标悬停在 View 的表格单元格上,您会看到它们的工具提示。正确。

但是:如果您碰巧将鼠标移到内部 tooptip 并再次移出,焦点就会从编辑器转移到 View (反之亦然)!!

我不明白这是怎么回事。这确实让人分心。

有人见过吗?如果没有,请尝试一下!

要重现,请使用摘自 JFaceSnippets 3.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();
}

}

最佳答案

我同意你的看法,这种行为很奇怪,我也将其称为错误。仅仅因为工具提示标签已被处理而将焦点移动到基础表没有任何明显意义。

问题是由 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() 的事件显然是由工具提示的标签本身在其消失时生成的。

摆弄我们处理的几个参数对行为没有影响:让 useNativeToolTips() 返回 true,传递 RECREATE 而不是 NO_RECREATE...

您甚至不能继承 ColumnViewerToolTipSupport 并覆盖 afterHideToolTipEvent(),删除那个神秘的 setFocus() 调用,因为表查看器引用ColumnViewerToolTipSupport.viewer 具有私有(private)访问权限。

我能看到的唯一行动方案是提交错误,看看您是否可以从 JFace 开发人员那里获得一些建议。我非常有兴趣了解 setFocus() 调用背后的想法。

关于java - JFace 查看器钢材焦点的自定义工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14378216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com