如何将JList绑定到Bean类属性

时间:2011-09-14 05:06:11

标签: java swing beans-binding

我尝试将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站点中有一个示例,但它用于直接从数据库获取数据。

1 个答案:

答案 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(行为没有区别,只是为了让它可编译: - )