JGoodies Binding: привязка объекта с JCombobox и значениями по умолчанию
У меня есть следующая проблема:
Я хочу связать JCombobox в своем View с моей моделью DomainModel, чтобы позже я мог получить его с AnotherModel.getModel();
Я написал собственный CellRenderer, чтобы он выглядел как "ID - Name". Но когда я выбираю значение Combobox и вызываю "AnotherModel". GetModel, значение в нем не сохраняется.
Разве нельзя связывать сложные типы данных с помощью JGoodies Bindings? С String он работает нормально, но я хочу связать объект 'DomainModel'
Вот упрощенный код:
Вид:
public class View extends JPanel {
private JComboBox<DomainModel> cmbValueModel;
public View(AntotherModel antotherModel, List<DomainModel> manyDomainModels) {
PresentationModel<DomainModel> domainModel = new PresentationModel<DomainModel>();
domainModel.setBean(antotherModel.getModel());
cmbValueModel = BasicComponentFactory.createComboBox(new SelectionInList<DomainModel>(manyDomainModels, domainModel.getModel(DomainModel.PROPERTYNAME_NAME)));
Bindings.bind(cmbValueModel, new SelectionInList<>(), "");
cmbValueModel.setRenderer(new DefaultListCellRenderer(){
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
return super.getListCellRendererComponent(list, value == null ? null : ((DomainModel)value).getId() + " - " + ((DomainModel)value).getName() , index, isSelected,
cellHasFocus);
}
});
}
}
Домен:
public class DomainModel extends Model{
public static final String PROPERTYNAME_NAME = "name";
@GeneratedValue
private int id;
private String name;
public void setName(String name) {
String oldVal = this.name;
this.name = name;
changeSupport.firePropertyChange(PROPERTYNAME_NAME, oldVal, name);
}
public String getName(){
return name;
}
public int getId(){
return id;
}
}
Другая модель:
public class AntotherModel extends Model{
public static final String PROPERTYNAME_MODEL = "model";
private int id;
private DomainModel model;
public int getId() {
return id;
}
public DomainModel getModel() {
return model;
}
public void setId(int id) {
this.id = id;
}
public void setModel(DomainModel model) {
DomainModel oldVal = this.model;
this.model = model;
changeSupport.firePropertyChange(PROPERTYNAME_MODEL, oldVal, model);
}
}
1 ответ
Ваш код не компилируется и не запускается, поэтому довольно сложно понять, что вы пытаетесь сделать. В приведенном ниже примере показана привязка комбинированного списка к списку DomainModels, если это то, что вам нужно; Вы можете добавить valueChangeListener в selectionInList, чтобы что-то делать, когда пользователь изменяет выбор. НТН
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import com.jgoodies.binding.adapter.BasicComponentFactory;
import com.jgoodies.binding.list.SelectionInList;
public class View extends JPanel {
private JComboBox comboBox;
public View(AnotherModel anotherModel, List<DomainModel> manyDomainModels) {
final SelectionInList<DomainModel> selectionInList = new SelectionInList<DomainModel>(manyDomainModels);
comboBox = BasicComponentFactory.createComboBox(selectionInList);
comboBox.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
return super.getListCellRendererComponent(list, value == null ? null : ((DomainModel) value).getId() + " - "
+ ((DomainModel) value).getName(), index, isSelected, cellHasFocus);
}
});
add(comboBox);
}
public static void main(String[] args) {
final JFrame frame = new JFrame();
final AnotherModel anotherModel = new AnotherModel();
final List<DomainModel> manyDomainModels = new ArrayList<DomainModel>();
final DomainModel domainModel1 = new DomainModel();
domainModel1.setName("foo");
final DomainModel domainModel2 = new DomainModel();
domainModel2.setName("bar");
final DomainModel domainModel3 = new DomainModel();
domainModel3.setName("baz");
manyDomainModels.add(domainModel1);
manyDomainModels.add(domainModel2);
manyDomainModels.add(domainModel3);
frame.getContentPane().add(new View(anotherModel, manyDomainModels));
frame.pack();
frame.setVisible(true);
}
}