我尝试将JList
绑定到绑定类属性Vector
。在绑定类中,更新UI中的Vector
时会更新JTextField
。
public void setName(String name) {
String oldName = this.name;
this.name = name;
Vector oldList=this.list;
list.add(name);
propertySupport.firePropertyChange("name", oldName, this.name); //textField updates
propertySupport.firePropertyChange(PROP_LIST, oldList, list); // JList
}
另外另一个单独的setter可用于更新Vector
。我也设置了添加/删除PropertyChangeListeners。
我真正的要求是根据JList
课程中的数据更新BeanBinding
。例如,当用户键入JTextField
时,应将数据库中的相关数据和类中的现有变量加载到JList
。
请告诉我如何在NetBeans中绑定BeanBinding
的数据JList
类(源)属性。至少任何教程链接。 NetBeans站点中有一个示例,但它用于直接从数据库获取数据。
答案 0 :(得分:3)
不知道Netbeans,只是简单的编码:-)在那里,将你的列表包装成一个ObservableList并对observable进行所有更改都应该有效。这是一个可以运行的代码剪断(对不起长度,现在没有能力将其剥离)
public class SimpleListBinding {
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(SimpleListBinding.class.getName());
private JComponent content;
private JList list;
private JTextField textField;
private List<MyBean> beanList;
private JButton modifyButton;
private JButton addButton;
/**
* Binds list and simple properties.
*/
private void bindBasics() {
BindingGroupBean context = new BindingGroupBean();
JListBinding listBinding = SwingBindings.createJListBinding(UpdateStrategy.READ_WRITE,
beanList, list);
listBinding.setDetailBinding(BeanProperty.create("value"));
context.addBinding(listBinding);
context.addBinding(Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,
list, BeanProperty.create("selectedElement.value"),
textField, BeanProperty.create("text")));
context.bind();
Action action = new AbstractAction("programatically change") {
public void actionPerformed(ActionEvent e) {
int selectedBean = list.getSelectedIndex();
if (selectedBean < 0) return;
MyBean bean = beanList.get(selectedBean);
bean.setValue(bean.getValue() + "*");
}
};
modifyButton.setAction(action);
Action add = new AbstractAction("add bean") {
int count = 0;
@Override
public void actionPerformed(ActionEvent e) {
beanList.add(new MyBean("added: " + count++));
}
};
addButton.setAction(add);
}
private void initData() {
MyBean[] beans = new MyBean[] {
new MyBean("first"), new MyBean("second"), new MyBean("third")
};
beanList = ObservableCollections.observableList(new ArrayList(Arrays.asList(beans)));
}
public static class MyBean extends AbstractBean {
private String value;
private boolean active;
public MyBean(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
Object old = getValue();
this.value = value;
firePropertyChange("value", old, getValue());
}
public void setActive(boolean active) {
boolean old = getActive();
this.active = active;
firePropertyChange("active", old, getActive());
}
public boolean getActive() {
return active;
}
}
private JComponent getContent() {
if (content == null) {
initComponents();
content = build();
initData();
bindBasics();
}
return content;
}
private JComponent build() {
JComponent comp = Box.createVerticalBox();
comp.add(new JScrollPane(list));
comp.add(textField, BorderLayout.SOUTH);
comp.add(modifyButton);
comp.add(addButton);
return comp;
}
private void initComponents() {
list = new JList();
textField = new JTextField();
modifyButton = new JButton("modify programmtically");
addButton = new JButton();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final JXFrame frame = new JXFrame("List binding", true);
frame.add(new SimpleListBinding().getContent());
frame.pack();
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
编辑:用JList替换JXList(行为没有区别,只是为了让它可编译: - )