我正在寻找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;
}
}