Java 如何将JList绑定到Bean类属性
我试图将Java 如何将JList绑定到Bean类属性,java,swing,beans-binding,Java,Swing,Beans Binding,我试图将JList绑定到绑定类属性Vector。在binding类中,当UI中的JTextField被更新时,向量将被更新 public void setName(String name) { String oldName = this.name; this.name = name; Vector oldList=this.list; list.add(name); propertySupport.firePropertyChange("name", ol
JList
绑定到绑定类属性Vector
。在binding类中,当UI中的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可用于更新向量
。我还设置了添加/删除属性ChangeListeners
我真正的需求是根据BeanBinding
类中的数据更新JList
。例如,当用户在JTextField
中键入时,来自数据库和类中现有变量的相关数据应加载到JList
中
请告诉我如何为NetBeans中的JList
绑定数据BeanBinding
class(source)属性。至少有任何教程链接。NetBeans站点中有一个示例,但它是用于直接从数据库获取数据的。不知道NetBeans,只是简单的编码:-)在这个示例中,将您的列表包装到observable列表中,并对observable进行所有更改。这里有一个被剪掉的可运行代码(很抱歉这么长,现在没有精力把它删掉)
公共类SimpleListBinding{
@抑制警告(“未使用”)
专用静态最终记录器日志=记录器
.getLogger(SimpleListBinding.class.getName());
私有组件内容;
私人名单;
私有JTextField textField;
私人名单;
私有JButton修改按钮;
私有JButton addButton;
/**
*绑定列表和简单属性。
*/
私有void bindBasics(){
BindingGroupBean上下文=新的BindingGroupBean();
JListBinding listBinding=SwingBindings.createJListBinding(UpdateStrategy.READ\u WRITE,
beanList,list);
setDetailBinding(BeanProperty.create(“value”));
addBinding(listBinding);
context.addBinding(Bindings.createAutoBinding(UpdateStrategy.READ\u WRITE,
列表,BeanProperty.create(“selectedElement.value”),
textField,BeanProperty.create(“text”);
context.bind();
动作动作=新的抽象动作(“程序性变更”){
已执行的公共无效操作(操作事件e){
int selectedBean=list.getSelectedIndex();
如果(selectedBean<0)返回;
MyBean=beanList.get(selectedBean);
setValue(bean.getValue()+“*”);
}
};
modifyButton.setAction(动作);
actionadd=新的抽象操作(“addbean”){
整数计数=0;
@凌驾
已执行的公共无效操作(操作事件e){
添加(newmybean(“添加:“+count++”);
}
};
addButton.setAction(添加);
}
私有void initData(){
MyBean[]bean=新的MyBean[]{
新豆豆(“第一”)、新豆豆(“第二”)、新豆豆(“第三”)
};
beanList=observeCollections.observebleList(新的ArrayList(Arrays.asList(bean));
}
公共静态类MyBean扩展了AbstractBean{
私有字符串值;
私有布尔活动;
公共MyBean(字符串值){
这个值=值;
}
公共字符串getValue(){
返回值;
}
公共void设置值(字符串值){
对象old=getValue();
这个值=值;
firePropertyChange(“value”,old,getValue());
}
public void setActive(布尔激活){
布尔old=getActive();
这个.active=active;
firePropertyChange(“活动”,旧,getActive());
}
公共布尔getActive(){
主动返回;
}
}
私有JComponent getContent(){
if(content==null){
初始化组件();
内容=构建();
initData();
bindBasics();
}
返回内容;
}
私有JComponent构建(){
JComponent comp=Box.createVerticalBox();
公司新增(新JScrollPane(列表));
组件添加(文本字段,BorderLayout.SOUTH);
组件添加(修改按钮);
组件添加(添加按钮);
返回补偿;
}
私有组件(){
列表=新JList();
textField=新的JTextField();
modifyButton=新JButton(“以编程方式修改”);
addButton=newjbutton();
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
最终JXFrame帧=新JXFrame(“列表绑定”,true);
添加(新的SimpleListBinding().getContent());
frame.pack();
框架。设置尺寸(400300);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
}
编辑:将JXList替换为JList(行为没有区别,只是为了使其可编译:-)您能告诉我使用ObservableList时会发生什么吗?我所做的只是将列表包装在ObservableList中。它工作得很好再次非常感谢:):)
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);
}
});
}
}