Próbuję zbudować łatwy program wahadłowy Java, gdzie wpisujesz swoją nazwę i nazwisko.

Istnieją dwa przyciski save i newDialog. Przycisk save zapisuje wpisane nazwy do klasy o imieniu. Przycisk newDialog otwiera nowe okno z zapisanymi nazwami już wydrukowanymi. Mój problem polega na tym, że chcę również odświeżyć stare okna i pokazać zapisane nazwy na polu TextField. Jak mogę to zrobić? Dziękuję wam wszystkim!

public class PersonFrame extends JFrame {   
    Person p = new Person();

    JTextField tf1 = new JTextField(Person.getForename());
    JTextField tf2 = new JTextField(Person.getSurname());
    JButton save = new JButton("Save");
    JButton newDialog = new JButton("NewDialog");

    public PersonFrame() {
        setTitle("Frame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel myPanel = new JPanel();
        myPanel.setLayout(new GridLayout(3,2));
        myPanel.add(new JLabel("Forename"));
        myPanel.add(new JLabel("Surname"));
        myPanel.add(tf1);
        myPanel.add(tf2);
        save.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                p.setForename(tf1.getText());
                p.setSurname(tf2.getText());
            }
        });

        newDialog.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SwingUtilities.updateComponentTreeUI(myPanel);
                PersonFrame personFrame = new PersonFrame();
                personFrame.pack();
                personFrame.setVisible(true);
            }
        });
        myPanel.add(save);
        myPanel.add(newDialog);
        this.getContentPane().add(myPanel);
    }

    public static void main(String[] args) throws InterruptedException {
        PersonFrame personFrame = new PersonFrame();
        personFrame.pack();
        personFrame.setVisible(true);
    }
}

Klasa osoby:

public class Person {   
    private static String forename;
    private static String surname;

    public void setForename(String forename) {
        Person.forename = forename;
    }

    public void setSurname(String nachname) {
        Person.surname = nachname;
    }

    public static String getSurname() {
        if(Person.surname == null){
            return null;
        } else {
            return Person.surname;
        }
    }

    public static String getForename() {
        if(Person.forename == null) {
            return null;
        } else {
            return Person.forename;
        }
    }
}

0
Chrissi 3 czerwiec 2018, 21:46

2 odpowiedzi

Najlepsza odpowiedź

Najlepszym sposobem byłby za wdrożenie klasy osoby ChangeListener: https://docs.Oboal.com/ JAVASA / 7 / DOCS / API / Javax / Swing / Event / Changelistener.html

Następnie każde miejsce wykorzystujące informacje od osoby wywołało person.addChangeListener(this);.

W każdym seter klasy, którą należy zadzwonić stateChanged, aby powiadomić swoich słuchaczy, że zmieni się Person.

Za każdym razem, gdy okna / ekrany otrzymują zdarzenie od Changelistener, powinni odświeżyć odpowiednie elementy (dla Ex, w jlabel, zadzwoniłbyś label.setText(person.getSurname());.

0
Guilherme Mussi 3 czerwiec 2018, 18:50

Najpierw dziękuję za wspaniałą radę Guilherme Musssi.

W następujący sposób zmieniam mój kod. Ale teraz już nie są oszczędzane. Naprawdę nie wiem, co zrobiłem źle.

public class PersonFrame extends JFrame{

Person p = new Person();

JTextField tf1 = new JTextField();
JTextField tf2 = new JTextField();
JButton save = new JButton("Save");
JButton newDialog = new JButton("NewDialog");

public PersonFrame() {
    setTitle("Frame");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    JPanel myPanel = new JPanel();
    myPanel.setLayout(new GridLayout(3,2));
    myPanel.add(new JLabel("Forename"));
    myPanel.add(new JLabel("Surname"));
    tf1.setText(Person.getForename());
    tf2.setText(Person.getSurname());
    myPanel.add(tf1);
    myPanel.add(tf2);
    save.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            p.setForename(tf1.getText());
            p.setSurname(tf2.getText());
        }
    });

    newDialog.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            SwingUtilities.updateComponentTreeUI(myPanel);
            PersonFrame personFrame = new PersonFrame();
            personFrame.pack();
            personFrame.setVisible(true);
        }
    });
    myPanel.add(save);
    myPanel.add(newDialog);
    this.getContentPane().add(myPanel);
}

public static void main(String[] args) throws InterruptedException {
    PersonFrame personFrame = new PersonFrame();
    personFrame.pack();
    personFrame.setVisible(true);
}

}

Klasa osoby:

public class Person {

private static String forename;
private static String surname;


public void setForename(String forename) {
    ChangeListener changingForename = new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            Person.forename = forename;
        }
    };
}

public void setSurname(String surname) {
    ChangeListener changingSurename = new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            Person.surname = surname;
        }
    };

}

public static String getSurname() {
    if(Person.surname == null){
        return null;
    } else {
        return Person.surname;
    }
}
public static String getForename() {
    if(Person.forename == null) {
        return null;
    } else {
        return Person.forename;
    }
}

}

0
Chrissi 3 czerwiec 2018, 19:10