我正在寻找SWT中的组合框的实现,该组合框将允许我使用任何对象的列表来设置其中的条目,类似于树和表的方式。

理想情况下,我希望下拉后的字符串能够与选定的最终字符串不同。 IE下拉菜单选择一个在其姓名旁边显示其年龄的人,但仅当其姓名被选中并放在框中时才显示其姓名。

我发现存在的所有内容都是基于字符串的组合框,无法描述不同的显示选项,因此,我想如果我想让它正常工作,我将不得不构建一个新组件,但是我希望有人已经实现了这样的功能。东西(因为我已经在某些应用程序中看到了这种功能),而我找不到它?

我希望创建这样的东西。

最佳答案

JFace ComboViewer 似乎是您想要的。它由保存您的对象的ModelProvider支持。 LabelProvider 用于显示组合内的文本。

Here是Vogella撰写的出色教程。

这是一个可以满足您需求的示例。如果显示的对象为 boolean 值,则基本上可以保存当前的组合选择:

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

    final ComboViewer viewer = new ComboViewer(shell, SWT.READ_ONLY);

    viewer.setContentProvider(ArrayContentProvider.getInstance());

    /* if the current person is selected, show text */
    viewer.setLabelProvider(new LabelProvider() {
        @Override
        public String getText(Object element) {
            if (element instanceof Person) {
                Person current = (Person) element;

                if(current.isSelected())
                    return current.getName();
                else
                    return "";
            }
            return super.getText(element);
        }
    });

    final Person[] persons = new Person[] { new Person("Baz"),
            new Person("BazBaz"), new Person("BazBazBaz") };

    viewer.setInput(persons);

    /* within the selection event, tell the object it was selected */
    viewer.addSelectionChangedListener(new ISelectionChangedListener() {
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
            IStructuredSelection selection = (IStructuredSelection) event.getSelection();
            Person person = (Person)selection.getFirstElement();

            for(Person p : persons)
                p.setSelected(false);

            person.setSelected(true);

            viewer.refresh();
        }
    });

    viewer.setSelection(new StructuredSelection(viewer.getElementAt(0)), true);

    shell.pack();
    shell.setSize(200, shell.getSize().y);
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}

public static class Person {
    private String name;

    /* this will be true for the selected person */
    boolean isSelected;

    public Person(String name) {
        this.name = name;
        this.setSelected(false);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean isSelected) {
        this.isSelected = isSelected;
    }

}

10-06 16:08
查看更多