2012-09-14 34 views
2

我有四个合成按顺序排列。在复合容器上启用焦点侦听器

每个组合都有一个复选框,标签和2个按钮。现在这些复合材料相继排列。

我想要关注这些项目,即当我使用标签从一个复合材料到另一个复合材料时,当前复合材料应该看起来突出显示。理想情况下,我希望它表现得像一个列表,当你选择一个项目,然后突出显示。这可能吗?

我知道组​​合充当其他小部件,控件的容器。我的要求是我有5个条目的列表,并且列表中的每个项目都有一个复选框,标签和两个按钮。我也希望它在选择时专注于它。

另外,请让我知道替代解决方案为我在上面描述的相同的用户界面。

+0

能否请您提供一个[SSCCE(http://www.sscce.org),以帮助我们了解你的挑战? – Baz

回答

1

要使标签从复合材料变为复合材料,请将每个复合材料的标签列表设置为一个控制器,您希望在标签后对其进行聚焦。例如,复选框:

composite.setTabList(new Control[]{checkButton}); 

要突出显示,您的想象力就是极限。您可以更改背景,添加一些边框,并将其命名。只要组合中的某个控件获得焦点,您就必须更新它。

这是一个完整的例子:

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

    createElement(shell); 
    createElement(shell); 
    createElement(shell); 
    createElement(shell); 

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

private static void createElement(final Composite parent) { 
    final Composite composite = new Composite(parent, SWT.BORDER); 
    composite.setLayout(new GridLayout(4, false)); 
    final Button checkButton = new Button(composite, SWT.CHECK); 
    new Label(composite, SWT.NONE); 
    final Button button1 = new Button(composite, SWT.PUSH); 
    final Button button2 = new Button(composite, SWT.PUSH); 
    Listener listener = new Listener() { 
     @Override 
     public void handleEvent(Event event) { 
      for (Control control : parent.getChildren()) { 
       control.setBackground(null); 
      } 
      composite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_RED)); 
      if (event.widget == button1 || event.widget == button2) { 
       checkButton.setFocus(); 
      } 
     } 
    }; 
    checkButton.addListener(SWT.FocusIn, listener); 
    button1.addListener(SWT.FocusIn, listener); 
    button2.addListener(SWT.FocusIn, listener); 
    composite.setTabList(new Control[]{checkButton}); 
}