Java Beans -> PropertyChangeListener

frager2345

Aktives Mitglied
Hi, also ich verstehe bei einem Beispiel aus der Vorlesung nicht warum ,um dem Container "Bibliothek" beim Bean-Beobachter anzumelden, dies :
(Wenn die anderen Klassen als Code benötigt werden einfach schreiben 🙂 )
Java:
this.bib.addPropertyChangeListener(this);
geschrieben wurde.
reicht hier nicht einfach das was ich unten gemacht habe? Man will ja bib beim Listener anmelden?
Code:
bib.addPropertyChangeListener(this);
Hier mal der gesamte Code von der Klasse "BibliothekGUI":
Code:
public class BibliothekGUI extends JFrame implements PropertyChangeListener {
    private Bibliothek bib;
    private JTextArea taDisplay;
    public BibliothekGUI(Bibliothek bib) {
        super("Universitaetsbibliothek");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        bib.addPropertyChangeListener(this); //this.bib.addPropertyChangeListener(this);
        this.bib = bib;
        taDisplay = new JTextArea(5, 50);
        taDisplay.setEnabled(false);
        add(new JScrollPane(taDisplay), BorderLayout.NORTH);
        JButton btnIsOpen = new JButton("Geoeffnet?");
        btnIsOpen.addActionListener(e -> {
            String message;
            if (this.bib.isOpen()) {
                message = "Die Bibliothek hat geoeffnet";
            } else {
                message = "Die Bibliothek hat nicht geoeffnet";
            }
           JOptionPane.showMessageDialog(this, message);
        });
        add(btnIsOpen, BorderLayout.WEST);

        JButton btnAddBuch = new JButton("Buch hinzufuegen");
        btnAddBuch.addActionListener(e -> {
            new AddBook(this, this.bib);
        });
        add(btnAddBuch, BorderLayout.CENTER);

        JButton btnShowBooks = new JButton("Zeige alle Buecher");
        btnShowBooks.addActionListener(e -> {
            new ShowBooks(this, this.bib);
        });
        add(btnShowBooks, BorderLayout.EAST);
        JButton btnReturnBook = new JButton("Buch zurueckgeben");
        btnReturnBook.addActionListener(e -> {
           try {
               returnBook();
           } catch (IllegalLoanException exception) {
               String msg = "Fehler beim Zurueckgeben: " + exception.getMessage();
               JOptionPane.showMessageDialog(this, msg);
           }
        });
        add(btnReturnBook, BorderLayout.SOUTH);

        pack();
        setVisible(true);
    }

    public void appendText(String s) {
        taDisplay.append(s);
    }

    private void returnBook() throws IllegalLoanException {
        String title = JOptionPane.showInputDialog(this, "Geben Sie den Titel des Buchs ein," +
                "das sie zurückgeben wollen:");
        if (bib.zurueckgeben(title)) {
            String msg = title + " rechtzeitig zurueckgegeben.";
            JOptionPane.showMessageDialog(this, msg);
        } else {
            String msg = title + " NICHT rechtzeitig zurueckgegeben.";
            JOptionPane.showMessageDialog(this, msg);
        }
    }

    public static void main(String[] args) {
        Bibliothek bib = Bibliothek.instance();
        new BibliothekGUI(bib);
        bib.linkBuch(new Buch("Christian Ullenboom", "Java ist auch eine Insel"));
        bib.linkBuch(new Buch("Robert Sedgewick", "Einfuehrung in die Programmierung mit Java"));
        bib.linkBuch(new Buch("Marc-Uwe Kling", "Qualityland"));
        bib.linkBuch(new Buch("David Eddings", "Kind der Prophezeiung"));
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        Buch b;
        if(evt.getPropertyName().equals("ausleihen")){
            b = (Buch) evt.getNewValue();
            if(b == null){
                return;
            }
            String leihen = "Ausgeliehen: " + b;
            taDisplay.append(leihen);
        } else if (evt.getPropertyName().equals("zurückgeben")) {
            b = (Buch) evt.getOldValue();
            if(b == null){
                return;
            }
            String zurueckgeben = "Zurückgegeben:" + b;
            taDisplay.append(zurueckgeben);
        } else if (evt.getPropertyName().equals("Buch hinzugefügt")) {
            b = (Buch) evt.getNewValue();
            if(b == null){
                return;
            }
            b.addPropertyChangeListener(this);
            String addBook = "Neues Buch:" + b;
            taDisplay.append(addBook);
        }
    }
}
Zudem hab ich unten nochmal die Methode propertyChange überschrieben , um die Events abzufragen, wenn ein Buch ausgeliehen, zurückgeben und hinzugefügt wurde. Passt hier das Vorgehen? War mir unsicher bei dem Teil wo ich dem neu hinzugefügten Buch einen neuen Listener hinzugefügt habe.
Gruß
 
*EDIT : Hab grad gesehen ein Parameter ist ja eine Bibliothek.... dann ist klar, dass man mit der this Referenz das Attribut meint..
 
Nur zum Verständnis:

Bei diesem Code:
Java:
    public BibliothekGUI(Bibliothek bib) {
        super("Universitaetsbibliothek");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        bib.addPropertyChangeListener(this); //this.bib.addPropertyChangeListener(this);
        this.bib = bib;

würde this.bib.addPropertyChangeListener(this); nicht funktionieren, da this.bib die Instanzvariable bib ist. Und die ist noch nicht initialisiert und daher null.

Wenn Du die Zeile this.bib = bib; vor diesen Aufruf setzen würdest, dann wäre es egal und du könntest es auf dem Parameter (bib) oder der Instanzvariable (this.bib) aufrufen.
 
Nur zum Verständnis:

Bei diesem Code:
Java:
    public BibliothekGUI(Bibliothek bib) {
        super("Universitaetsbibliothek");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        bib.addPropertyChangeListener(this); //this.bib.addPropertyChangeListener(this);
        this.bib = bib;

würde this.bib.addPropertyChangeListener(this); nicht funktionieren, da this.bib die Instanzvariable bib ist. Und die ist noch nicht initialisiert und daher null.

Wenn Du die Zeile this.bib = bib; vor diesen Aufruf setzen würdest, dann wäre es egal und du könntest es auf dem Parameter (bib) oder der Instanzvariable (this.bib) aufrufen.
Ja habs gemerkt, hat anfangs nicht funktioniert. Habs jetzt geändert. Danke !
 

Zurück
Oben