Привязка данных Swing Eclipse beansbinding-1.2.1.jar WindowBuilderPro - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать новый графический интерфейс с привязкой данных в Eclipse IDE с помощью WindowBuilder. Сначала я добавил в проект beansbinding-1.2.1.jar и получил вкладку «Привязки» для WindowBuilder.

Я создал Бин (JavaBean), Основной класс (Выполнить) и два разных JFrames (LabelWindow и TextFieldWindow). Все внизу в Посте. В окне LabelWindow я использовал JLabel для отображения данных из компонента (имя: «Foo»). Это работает отлично. Если я изменяю данные в bean-компоненте, меняются и данные в этом JLabel, и если я изменяю данные в этом JLabel, bean-компонент также изменяется.

В TextFieldWindow я использовал JTextField для отображения данных из бина. И это не работает, как JLabel. Графический интерфейс отображает данные из компонента "Foo", и если я изменяю значение компонента, он также появляется в JTextField. Это работает. Но если я изменю значение JTextField, значение Beans не изменится.

Весь JFrame создается «Мастером автоматической привязки данных Swing» из плагина WindowBuilder, и с 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();
            }
        }
    }
}

1 Ответ

0 голосов
/ 30 октября 2018

В вашем классе Run вы создаете два контейнера верхнего уровня. Я не запускал ваш опубликованный код, но никогда не пытался создать два контейнера верхнего уровня в одном приложении. Я предлагаю создать JFrame, который будет содержать JLabel и JTextField. Есть ли причина, по которой вы этого не сделали?

...