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

时间:2016-07-11 14:43:57

标签: java eclipse swt jface

我正在寻找一种方法,可以从扩展messageLabel的类中的Tab键顺序中删除TitleAreaDialog(在图像中用红色箭头强调)。解决方法目前看起来像这样:

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类中为我们产品中的每个实例实现。

enter image description here

1 个答案:

答案 0 :(得分:3)

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

  1. 您可以尝试操作标题图片标签的父级的标签顺序,该标签与邮件标签具有相同的父级

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

    @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;
    }
    

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

  3. 两者都需要扩展TitleAreaDialog,并且在某种程度上依赖于此类的实现细节。例如,如果标题图片标签被赋予额外的父级,那么setTabList()将对错误的复合操作。