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