java - 是否有任何对象作为数据和 LabelProvider 用于显示的 SWT 组合框?

标签 java combobox swt eclipse-rcp

我正在搜索 SWT 中组合框的实现,它允许我使用任何对象的列表设置其中的条目,类似于树和表。

理想情况下,我希望下拉时的字符串能够与选择后的最终字符串不同。 IE 下拉选择一个人,在列表中他们的名字旁边显示他们的年龄,但只有他们的名字被选中并放在框中。

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

我希望创造这样的东西。

enter image description here

最佳答案

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

}

关于java - 是否有任何对象作为数据和 LabelProvider 用于显示的 SWT 组合框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12511959/

相关文章:

用于从组合框中获取选定值的 JavaScript 代码

java - 填充许多元素时 SWT TreeViewer 速度很慢

java - 在鼠标按下事件中启动 "asyncExec"会导致阻塞行为

wpf - ComboBox 项目的货币格式

windows - 如何在 winforms 中重新绑定(bind)组合框?

java - 无法更新 Java Swing 中的 JButton

java - Netbeans 不会下载 Maven Artifact

java - SWTBot:在包资源管理器中的项目上按 "F5"

java - 避免阻塞状态变量副本?

java - 在类本身中创建一个实例