How to associate a JList with a Bean class

I tried to bind a JList to a property of the binding class, Vector . In the binding class, Vector updated when the JTextField in the user interface is updated.

 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 } 

Another separate setter for updating Vector is also available. I also added add / remove PropertyChangeListeners.

My real requirement is to update the JList according to the data in the BeanBinding class. For example, when a user enters a JTextField , the corresponding data from the database and existing variables in the class must be loaded into the JList .

Please let me know how to bind the BeanBinding class (source) data of a JList property in NetBeans. At least any textbook reference. The NetBeans website has a sample, but it is designed to receive data directly from the database.

+6
source share
1 answer

I don’t know what Netbeans is, just black coding :-) In this, collapse your list into an ObservableList and all changes on the observable should work. Here the runnable code was cut off (sorry for the length, you don’t have the energy to remove it right now)

 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); } }); } } 

Edit: replaced JXList with JList (there is no difference in behavior, just to make it compiled :-)

+3
source

Source: https://habr.com/ru/post/897285/


All Articles