【发布时间】:2019-04-02 07:08:20
【问题描述】:
我正在尝试使用 WindowBuilder 在 Eclipse IDE 下使用 Databinding 创建一个新的 GUI。 首先,我将 beansbinding-1.2.1.jar 添加到项目中并获得 WindowBuilder 的 Bindings 选项卡。
我创建了一个 Bean (JavaBean)、一个主类 (Run) 和两个不同的 JFrame(LabelWindow 和 TextFieldWindow)。全部在邮报下面。 在 LabelWindow 中,我使用了 JLabel 来显示 Bean 中的数据(名称:“Foo”)。那是完美的工作。如果我更改 bean 中的数据,则该 JLabel 中的数据也会更改,如果我更改该 JLabel 中的数据,则 Bean 也会更改。
在 TextFieldWindow 中,我使用了 JTextField 来显示 Bean 中的数据。这不像 JLabel 那样工作。 Gui 显示来自 Bean“Foo”的数据,如果我更改 Beans 值,它也会出现在 JTextField 中。那是有效的。 但是如果我改变 JTextField 的值,Beans 的值不会改变。
整个 JFrame 由 WindowBuilder 插件中的“Swing 自动数据绑定向导”生成,使用 JLabel 可以工作,使用 JTextField 只能在一个方向上工作。
谁能告诉我出了什么问题以及如何解决这个问题(我更喜欢使用 WindowBuilder / Bindingtab 的方式,我只是不想手动更改太多)。
这是我的代码:
JavaBean.java
package def;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class JavaBean {
private String name = "Foo";
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public String getName() {
return name;
}
public void setName(String name) {
String oldValue = this.name;
this.name = name;
pcs.firePropertyChange("name", oldValue, name);
}
public void addPropertyChangeListener(PropertyChangeListener pcl) {
pcs.addPropertyChangeListener(pcl);
}
public void removePropertyChangeListener(PropertyChangeListener pcl) {
pcs.removePropertyChangeListener(pcl);
}
}
Run.java
package def;
import java.awt.EventQueue;
public class Run {
public static void main(String[] args) {
//Switch these two Versions to Test either the Label Version or the TextField Version
//EventQueue.invokeLater( () -> new LabelWindow().setVisible(true));
EventQueue.invokeLater( () -> new TextFieldWindow().setVisible(true));
}
}
LabelWindow.java
package def;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.jdesktop.beansbinding.AutoBinding;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.beansbinding.Bindings;
public class LabelWindow extends JFrame {
private static final long serialVersionUID = 1L;
private BindingGroup m_bindingGroup;
private JPanel m_contentPane;
private JavaBean javaBean = new JavaBean();
private JLabel nameJLabel;
public LabelWindow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
m_contentPane = new JPanel();
setContentPane(m_contentPane);
//
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[] { 0, 0, 0 };
gridBagLayout.rowHeights = new int[] { 0, 0 };
gridBagLayout.columnWeights = new double[] { 0.0, 1.0, 1.0E-4 };
gridBagLayout.rowWeights = new double[] { 0.0, 1.0E-4 };
m_contentPane.setLayout(gridBagLayout);
JLabel nameLabel = new JLabel("Name:");
GridBagConstraints labelGbc_0 = new GridBagConstraints();
labelGbc_0.insets = new Insets(5, 5, 5, 5);
labelGbc_0.gridx = 0;
labelGbc_0.gridy = 0;
m_contentPane.add(nameLabel, labelGbc_0);
nameJLabel = new JLabel();
GridBagConstraints componentGbc_0 = new GridBagConstraints();
componentGbc_0.insets = new Insets(5, 0, 5, 5);
componentGbc_0.fill = GridBagConstraints.HORIZONTAL;
componentGbc_0.gridx = 1;
componentGbc_0.gridy = 0;
m_contentPane.add(nameJLabel, componentGbc_0);
if (javaBean != null) {
m_bindingGroup = initDataBindings();
}
}
protected BindingGroup initDataBindings() {
BeanProperty<JavaBean, String> nameProperty = BeanProperty.create("name");
BeanProperty<JLabel, String> textProperty = BeanProperty.create("text");
AutoBinding<JavaBean, String, JLabel, String> autoBinding = Bindings
.createAutoBinding(AutoBinding.UpdateStrategy.READ_WRITE, javaBean, nameProperty, nameJLabel,
textProperty);
autoBinding.bind();
//
BindingGroup bindingGroup = new BindingGroup();
bindingGroup.addBinding(autoBinding);
//
return bindingGroup;
}
}
TextFieldWindow.java
package def;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.jdesktop.beansbinding.AutoBinding;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.beansbinding.Bindings;
public class TextFieldWindow extends JFrame {
private static final long serialVersionUID = 1L;
private BindingGroup m_bindingGroup;
private JPanel m_contentPane;
private JavaBean javaBean = new JavaBean();
private JTextField nameJTextField;
public TextFieldWindow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
m_contentPane = new JPanel();
setContentPane(m_contentPane);
//
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[] { 0, 0, 0 };
gridBagLayout.rowHeights = new int[] { 0, 0 };
gridBagLayout.columnWeights = new double[] { 0.0, 1.0, 1.0E-4 };
gridBagLayout.rowWeights = new double[] { 0.0, 1.0E-4 };
m_contentPane.setLayout(gridBagLayout);
JLabel nameLabel = new JLabel("Name:");
GridBagConstraints labelGbc_0 = new GridBagConstraints();
labelGbc_0.insets = new Insets(5, 5, 0, 5);
labelGbc_0.gridx = 0;
labelGbc_0.gridy = 0;
m_contentPane.add(nameLabel, labelGbc_0);
nameJTextField = new JTextField();
GridBagConstraints componentGbc_0 = new GridBagConstraints();
componentGbc_0.insets = new Insets(5, 0, 0, 0);
componentGbc_0.fill = GridBagConstraints.HORIZONTAL;
componentGbc_0.gridx = 1;
componentGbc_0.gridy = 0;
m_contentPane.add(nameJTextField, componentGbc_0);
if (javaBean != null) {
m_bindingGroup = initDataBindings();
}
}
protected BindingGroup initDataBindings() {
BeanProperty<JavaBean, String> nameProperty = BeanProperty.create("name");
BeanProperty<JTextField, String> textProperty = BeanProperty.create("text");
AutoBinding<JavaBean, String, JTextField, String> autoBinding = Bindings
.createAutoBinding(AutoBinding.UpdateStrategy.READ_WRITE, javaBean, nameProperty, nameJTextField,
textProperty);
autoBinding.bind();
//
BindingGroup bindingGroup = new BindingGroup();
bindingGroup.addBinding(autoBinding);
//
return bindingGroup;
}
public JavaBean getJavaBean() {
return javaBean;
}
public void setJavaBean(JavaBean newJavaBean) {
setJavaBean(newJavaBean, true);
}
public void setJavaBean(JavaBean newJavaBean, boolean update) {
javaBean = newJavaBean;
if (update) {
if (m_bindingGroup != null) {
m_bindingGroup.unbind();
m_bindingGroup = null;
}
if (javaBean != null) {
m_bindingGroup = initDataBindings();
}
}
}
}
【问题讨论】:
-
我认为问题出在 JavaBean 类的两个不同实例中(TextFieldWindow 和 LabelWindow 中的 JavaBean javaBean = new JavaBean())。尝试在 main() 方法中创建一个 JavaBean 实例,并将它的 throw 构造函数传递给 *Window。
-
它只是一次展示了两个版本。我更改了原始帖子以使其清楚并命令标签版本(随意在它们之间切换)。
标签: java eclipse swing data-binding windowbuilder