我有两个课程在各方面都相同但只有一个;第一个实现List<RuleSet>
,而第二个实现List
。他们拥有相同的成员和方法。当我尝试使用Netbeans&#39;来构建GUI时GUI构建器,我无法绑定到列表中的属性,而我可以绑定到另一个。
是否存在阻止我使用类实现PatternSet_I
接口并将其用作Bean的东西?我这次可以解决这个问题,但这需要改变我的设计,我并不期望。
使事情更清晰的具体例子:
List
实施PatternSet_J
List
没有实施PatternSet_I
PatternSet_J
List<RuleSet>
我将在下面添加代码:
PatternSet_I 实施package dvrminer.pattern;
import dvrminer.rule.RuleSet;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class PatternSet_I implements List<RuleSet> {
public static final String PROP_STRING = "string";
private Pattern pattern;
private final List<RuleSet> ruleSets;
private final transient PropertyChangeSupport propertyChangeSupport
= new PropertyChangeSupport(this);
public PatternSet_I() {
ruleSets = new ArrayList<>();
}
public Pattern getPattern() {
return pattern;
}
public void setPattern(Pattern pattern) {
this.pattern = pattern;
}
// @Override
public int size() {
return ruleSets.size();
}
// @Override
public boolean isEmpty() {
return ruleSets.isEmpty();
}
// @Override
public boolean contains(Object o) {
return ruleSets.contains(o);
}
// @Override
public Iterator<RuleSet> iterator() {
return ruleSets.iterator();
}
// @Override
public Object[] toArray() {
return ruleSets.toArray();
}
// @Override
public <T> T[] toArray(T[] a) {
return ruleSets.toArray(a);
}
// @Override
public boolean add(RuleSet e) {
return ruleSets.add(e);
}
// @Override
public boolean remove(Object o) {
return ruleSets.remove(o);
}
// @Override
public boolean containsAll(Collection<?> c) {
return ruleSets.containsAll(c);
}
// @Override
public boolean addAll(Collection<? extends RuleSet> c) {
return ruleSets.addAll(c);
}
// @Override
public boolean addAll(int index, Collection<? extends RuleSet> c) {
return ruleSets.addAll(index, c);
}
// @Override
public boolean removeAll(Collection<?> c) {
return ruleSets.removeAll(c);
}
// @Override
public boolean retainAll(Collection<?> c) {
return ruleSets.retainAll(c);
}
// @Override
public void clear() {
ruleSets.clear();
}
// @Override
public boolean equals(Object o) {
return ruleSets.equals(o);
}
// @Override
public int hashCode() {
return ruleSets.hashCode();
}
// @Override
public RuleSet get(int index) {
return ruleSets.get(index);
}
// @Override
public RuleSet set(int index, RuleSet element) {
return ruleSets.set(index, element);
}
// @Override
public void add(int index, RuleSet element) {
ruleSets.add(index, element);
}
// @Override
public RuleSet remove(int index) {
return ruleSets.remove(index);
}
// @Override
public int indexOf(Object o) {
return ruleSets.indexOf(o);
}
// @Override
public int lastIndexOf(Object o) {
return ruleSets.lastIndexOf(o);
}
// @Override
public ListIterator<RuleSet> listIterator() {
return ruleSets.listIterator();
}
// @Override
public ListIterator<RuleSet> listIterator(int index) {
return ruleSets.listIterator(index);
}
// @Override
public List<RuleSet> subList(int fromIndex, int toIndex) {
return ruleSets.subList(fromIndex, toIndex);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
}
List<RuleSet>
PatternSet_J 并没有实现package dvrminer.pattern;
import dvrminer.rule.RuleSet;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class PatternSet_J {
public static final String PROP_STRING = "string";
private Pattern pattern;
private final List<RuleSet> ruleSets;
private final transient PropertyChangeSupport propertyChangeSupport
= new PropertyChangeSupport(this);
public PatternSet_J() {
ruleSets = new ArrayList<>();
}
public Pattern getPattern() {
return pattern;
}
public void setPattern(Pattern pattern) {
this.pattern = pattern;
}
// @Override
public int size() {
return ruleSets.size();
}
// @Override
public boolean isEmpty() {
return ruleSets.isEmpty();
}
// @Override
public boolean contains(Object o) {
return ruleSets.contains(o);
}
// @Override
public Iterator<RuleSet> iterator() {
return ruleSets.iterator();
}
// @Override
public Object[] toArray() {
return ruleSets.toArray();
}
// @Override
public <T> T[] toArray(T[] a) {
return ruleSets.toArray(a);
}
// @Override
public boolean add(RuleSet e) {
return ruleSets.add(e);
}
// @Override
public boolean remove(Object o) {
return ruleSets.remove(o);
}
// @Override
public boolean containsAll(Collection<?> c) {
return ruleSets.containsAll(c);
}
// @Override
public boolean addAll(Collection<? extends RuleSet> c) {
return ruleSets.addAll(c);
}
// @Override
public boolean addAll(int index, Collection<? extends RuleSet> c) {
return ruleSets.addAll(index, c);
}
// @Override
public boolean removeAll(Collection<?> c) {
return ruleSets.removeAll(c);
}
// @Override
public boolean retainAll(Collection<?> c) {
return ruleSets.retainAll(c);
}
// @Override
public void clear() {
ruleSets.clear();
}
// @Override
public boolean equals(Object o) {
return ruleSets.equals(o);
}
// @Override
public int hashCode() {
return ruleSets.hashCode();
}
// @Override
public RuleSet get(int index) {
return ruleSets.get(index);
}
// @Override
public RuleSet set(int index, RuleSet element) {
return ruleSets.set(index, element);
}
// @Override
public void add(int index, RuleSet element) {
ruleSets.add(index, element);
}
// @Override
public RuleSet remove(int index) {
return ruleSets.remove(index);
}
// @Override
public int indexOf(Object o) {
return ruleSets.indexOf(o);
}
// @Override
public int lastIndexOf(Object o) {
return ruleSets.lastIndexOf(o);
}
// @Override
public ListIterator<RuleSet> listIterator() {
return ruleSets.listIterator();
}
// @Override
public ListIterator<RuleSet> listIterator(int index) {
return ruleSets.listIterator(index);
}
// @Override
public List<RuleSet> subList(int fromIndex, int toIndex) {
return ruleSets.subList(fromIndex, toIndex);
}
/**
* Add PropertyChangeListener.
*
* @param listener
*/
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
/**
* Remove PropertyChangeListener.
*
* @param listener
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
}
,尽管其他方面相同。
PatternSet_I
测试是在NetBeans 8中构建的表单。它有一个PatternSet_J
和一个JTextArea
以及一个名为textArea
的{{1}}。我可以将textArea
绑定到patternSet_J1.pattern.name
但不绑定到patternSet_I1.pattern.name
。唯一的区别是patternSet_I1.pattern.name
实现List<RuleSet>
。
package dvrminer.pattern;
public class Test extends javax.swing.JPanel {
public Test() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
bindingGroup = new org.jdesktop.beansbinding.BindingGroup();
patternSet_I1 = new dvrminer.pattern.PatternSet_I();
patternSet_J1 = new dvrminer.pattern.PatternSet_J();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
textArea = new javax.swing.JTextArea();
textArea.setColumns(20);
textArea.setRows(5);
org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, patternSet_J1, org.jdesktop.beansbinding.ELProperty.create("${pattern.name}"), textArea, org.jdesktop.beansbinding.BeanProperty.create("text"));
bindingGroup.addBinding(binding);
jScrollPane1.setViewportView(textArea);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(0, 0, 0))
);
bindingGroup.bind();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private dvrminer.pattern.PatternSet_I patternSet_I1;
private dvrminer.pattern.PatternSet_J patternSet_J1;
private javax.swing.JTextArea textArea;
private org.jdesktop.beansbinding.BindingGroup bindingGroup;
// End of variables declaration
}