如何从 JFace 的 TitleAreaDialog 中的 Tab 键顺序中删除 messageLabel

How to remove messageLabel from tab order in JFace's TitleAreaDialog

我正在寻找一种方法来从扩展 TitleAreaDialog 的 class 的 Tab 键顺序中删除 messageLabel(图中用红色箭头强调)。目前的解决方法如下所示:

getButton(IDialogConstants.CANCEL_ID).addTraverseListener(new TraverseListener() {
  @Override
  public void keyTraversed(TraverseEvent e) {
    if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
      e.doit = false;
      textUsername.forceFocus();
    }
  }
});

我目前的解决方法是在最上层和最下层的复合材料中侦听 TraverseEvent 并手动将焦点强制到正确的复合材料。

但是,我正在寻找更通用的解决方案,可以在 CommonTitleAreaDialog class 中针对我们产品中的每个实例实施。

我看到了两种可能的方法来概括您的方法。

  1. 你可以尝试操纵标题图片标签parent的tab顺序,与消息标签parent相同

    getTitleImageLabel().getParent().setTabList( new Control[ 0 ] );
    
  2. 或者您可以将 TraverseListener 添加到按钮栏 (getButtonBar()) 的最后一个按钮,它会更改选项卡遍历并跳转到第一个可聚焦控件。要找到第一个控件,您可以挂钩 createDialogArea() 并从它 returns 的控件开始搜索正确的控件。 沿着这些线的东西:

    @Override
    protected Control createDialogArea( Composite parent ) {
      Control startPoint = super.createDialogArea( parent );
      Control firstControl = null;
      if( startPoint instanceof Composite ) {
        Composite composite = ( Composite )startPoint;
        Control[] children = composite.getChildren();
        for( Control control : children ) {
          if( ( control.getStyle() & SWT.NO_FOCUS ) == 0 ) {
            firstControl = control;
            break;
          }
        }
      }
      return parent;
    }
    

    可能需要更改代码以递归搜索第一个合适的控件。

两者都需要扩展TitleAreaDialog,并且在一定程度上依赖这个class的实现细节。例如,如果给标题图像标签额外的 parent,那么 setTabList() 将在错误的合成上运行。