Проверка пользовательского интерфейса не работает в Swing MetaWidget

Я использую MetaWidget для Swing. Я могу создать пользовательский интерфейс, и BeanBinding также работает. Однако проверки, такие как обязательное поле и максимальная длина, не работают. Я ожидаю, что первая строка в методе savePerson() вызовет исключение, когда я оставлю поле "Имя" пустым. Можете ли вы помочь? Есть ли файл Jar, который мне не хватает? Что-то мне не хватает в моем коде?

Основной класс пользовательского интерфейса

public class MetaWidgetFrame extends JFrame {

    private JPanel contentPane;
    private SwingMetawidget metawidget = new SwingMetawidget();


    /**
     * Create the frame.
     */
    public MetaWidgetFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JPanel contentPanel = new JPanel();
        contentPane.add(contentPanel, BorderLayout.CENTER);

        JPanel controlsPanel = new JPanel();
        contentPanel.setLayout(new BorderLayout(0, 0));

        contentPane.add(controlsPanel, BorderLayout.SOUTH);

        JButton btnSave = new JButton("Save");
        btnSave.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                savePerson();
            }
        });
        controlsPanel.add(btnSave);

        Person person = new Person();
        person.setUserID(new Integer(1));
        person.setFirstName("Raman");
        person.setLastName("C V");

        CompositeInspectorConfig inspectorConfig = new CompositeInspectorConfig().setInspectors(
                  new JpaInspector()
                , new PropertyTypeInspector()
                );

        BeansBindingProcessor bbp = new BeansBindingProcessor();


        metawidget.setInspector( new CompositeInspector( inspectorConfig ) );
        metawidget.addWidgetProcessor(new ReflectionBindingProcessor());
        metawidget.addWidgetProcessor(bbp);
        metawidget.setToInspect(person);

        contentPanel.add(metawidget, BorderLayout.CENTER);
        pack();
    }

    public void savePerson() {
        metawidget.getWidgetProcessor(BeansBindingProcessor.class).save(metawidget );
        Person personSaved = metawidget.getToInspect();
        System.out.println("" + personSaved);
    }
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MetaWidgetFrame frame = new MetaWidgetFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Класс сущности

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "person", catalog = "mydb")
public class Person {

    private Integer userID;
    private String firstName;
    private String lastName;

    public Person() {
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)

    @Column(name = "userID", unique = true, nullable = false)
    public Integer getUserID() {
        return userID;
    }

    @Column(name = "firstName", nullable = false, length = 10)
    public String getFirstName() {
        return firstName;
    }

    @Column(name = "lastName", nullable = false, length = 45)
    public String getLastName() {
        return lastName;
    }

    public void setUserID(Integer userID) {
        this.userID = userID;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Person: "
                + "\n userID = " + userID  
                + "\n firstName = " + firstName  
                + "\n lastName = " + lastName;
    }
}

Экран:

Экран с отключенным именем

Консольный вывод:

Person: 
 userID = 1
 firstName = 
 lastName = C V

1 ответ

Решение

Платформа Swing не поддерживает связывание или проверку данных из коробки. Поэтому и SwingMetawidget тоже не делает.

Однако вы можете дополнить Swing различными сторонними фреймворками, такими как BeansBinding, Commons BeansUtils, JGoodies Validator или Commons Validator. И поэтому вы можете применять плагины Metawidget для каждой из этих технологий.

Вы уже применяете сторонний плагин BeansBinding, чтобы ваши привязки работали.

Вам также необходимо применить один из плагинов валидатора. Metawidget напрямую поддерживает JGoodies Validator, Commons Validator, oVal и Hibernate Validator. Выберите тот, который подходит вашей существующей архитектуре. Или вы можете свернуть свой собственный WidgetProcessor.

Другие вопросы по тегам