MarkyVasconcelos / Towel

Common Swing & Utilities solutions.
https://github.com/MarkyVasconcelos/Towel/wiki/Introduction
59 stars 22 forks source link

Dúvida sobre Action #3

Closed ghost closed 7 years ago

ghost commented 13 years ago

Mark, estava lendo o wiki sobre o @Action e surgiu um problema que não soube resolver.

Quando eu aperto o botão Mark, o método change e print são executados. O problema é que no printAttrs só mostra Name: Age: 0 Live?: false

package br.com.mobhub.fv.desktop.form.testes;

import java.awt.EventQueue;

@Form(PersonBinder.class)
public class PersonForm extends JFrame {

    private static final long serialVersionUID = 1L;

    private JPanel contentPane;

    @Bindable(field="name")
    private JTextField name;

    @Bindable(field="age", formatter=IntFormatter.class)
    private JTextField age;

    @Bindable(field="live")
    private JCheckBox live;

    private Binder binder;

    @ActionSequence({@Action(method="change"), @Action(method="print")})
    private JButton btnMark;
    private JButton btnNewButton;

    // IntFormatter formats an string into a number
    public static class IntFormatter implements Formatter {
        public Object format(Object obj) {
            Integer d = (Integer) obj;
            return d.toString();
        }
        public Object parse(Object obj) {
            return Integer.valueOf(Integer.parseInt((String) obj));
        }
        public String getName() {
            return "int";
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    PersonForm frame = new PersonForm();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @SuppressWarnings("unused")
    private void change() {
        PersonBinder p = new PersonBinder();
        p.setName("Rodrigo");
        p.setAge(33);
        p.setLive(true);
        binder.updateView(p);
    }

    @SuppressWarnings("unused")
    private void print() {
        PersonBinder p = new PersonBinder();
        binder.updateModel(p);
        p.printAttrs();
    }

    public PersonForm() {
        setTitle("Teste");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 280, 191);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new MigLayout("insets 5 5 5 5", "[52.00,left][grow]", "[][][][]"));

        JLabel lblNewLabel = new JLabel("Name");
        contentPane.add(lblNewLabel, "cell 0 0,alignx trailing");

        name = new JTextField();
        contentPane.add(name, "cell 1 0,growx");
        name.setColumns(10);

        JLabel lblNewLabel_1 = new JLabel("Age");
        contentPane.add(lblNewLabel_1, "cell 0 1,alignx trailing");

        age = new JTextField();
        contentPane.add(age, "cell 1 1,growx");
        age.setColumns(10);

        live = new JCheckBox("Live");
        contentPane.add(live, "cell 1 2");

        btnMark = new JButton("Change");
        contentPane.add(btnMark, "flowx,cell 1 3");

        btnNewButton = new JButton("Update");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                PersonBinder person = new PersonBinder();
                binder.updateModel(person);
                person.printAttrs();
            }
        });
        contentPane.add(btnNewButton, "cell 1 3");

        // towel
        new ActionManager(this);
        binder = new AnnotatedBinder(this);
    }
}

Abraço

MarkyVasconcelos commented 13 years ago

Mas quem é esse PersonBinder que voce criou?

Sua tela só deveria ter apenas um binder, utilize a instancia que voce já tem para isso.

ghost commented 13 years ago

O PersonBinder é o seu Person, só mudei o nome mesmo.

package br.com.mobhub.fv.desktop.form.testes;

public class PersonBinder {

    private String name;
    private int age;
    private boolean live;

    public void printAttrs() {
        System.out.println("Name: " + getName());
        System.out.println("Age: " + getAge());
        System.out.println("Live?: " + isLive());
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setLive(boolean live) {
        this.live = live;
    }

    public boolean isLive() {
        return live;
    }
}
MarkyVasconcelos commented 13 years ago

Ahh.. acabei de ver o que acontece, o método print é chamado antes do change.

Isso realmente é uma issue.

Se voce colocar

@ActionSequence({@Action(method="print"),@Action(method="change")})

Vai executar na ordem certa e vai acontecer o que voce esperava.

Irei arrumar para a proxima versao, obrigado por avisar.

ghost commented 13 years ago

Um workaround seria ter um método que chamaria os outros métodos na sequencia que eu quero.

Vlw