在复合容器上启用焦点侦听器

时间:2012-09-14 08:08:45

标签: java swt composite

我按顺序排列了四个复合材料。

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

我想启用对这些项目的关注,即当我使用 tab 从一个复合到另一个复合时,当前复合应该看起来突出显示。理想情况下,我希望它的行为类似于列表,当您选择一个项目然后突出显示。这可能吗?

我知道复合作为其他小部件,控件的容器。我的要求是我有一个包含5个条目的列表,并且列表中的每个项目都有一个复选框,标签和两个按钮。我还希望它能够在被选中时专注于它。

另外,请告诉我上述相同用户界面的替代解决方案。

1 个答案:

答案 0 :(得分: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});
}