Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [Java] Ereignisse auslösen und auf selbige reagieren (https://www.delphipraxis.net/120937-%5Bjava%5D-ereignisse-ausloesen-und-auf-selbige-reagieren.html)

Luckie 19. Sep 2008 07:58


[Java] Ereignisse auslösen und auf selbige reagieren
 
So, wir machen gerade Java in der Schule. Da das hier irgendwie nicht so richtig läuft, versuche ich das etwas im eigenstudium voranzutreiben.

Ich habe mir gerade das Thema Ereignisse vorgenommen. Allerdings habe ich eine Konsolenanwendung und alle Beispiele, die ich gefunden haben, beziehen sich auf Windows Anwendungen mit Fenster und Kontrollelementen.

Ichhabe zum Beispiel folgende Klasse (Ausschnitt):
Code:
package Bank;

import java.util.ArrayList;
import java.util.ListIterator;
import java.awt.event.*
import Bank.Konto;

public class Kunde
{
   private String _name;
   private String _vorname;
   private ArrayList _konten;

   public Kunde()
   {
      _konten = new ArrayList();
   }

   // Getter/Setter -------------------------------------------------------------
   public String getName()
   {
      return _name;
   }

   public void setName(String name)
   {
      _name = name;
   }

   public String getVorname()
   {
      return _vorname;
   }

   public void setVorname(String vorname)
   {
      _vorname = vorname;
   }

   public ArrayList getKonten()
   {
      return _konten;
   }

   // Methoden ------------------------------------------------------------------

   /*
    * Konto dem Kunden hinzufügen    
    */    
   public void addKonto(Konto konto)
   {
      _konten.add(konto);
   }
Jetzt würde ich zum Beispiel gerne bei addKonto das Ereignis OnAddKonto auslösen. Herausgefundne habe ich schon, dass meine Klasse irgendwie eine Methode addEventListener oder so ähnlich braucht. Weiter bin ich leider erstmal nicht gekommen.

DeddyH 19. Sep 2008 08:01

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Mein Java ist zwar schon ziemlich eingerostet, aber AFAIR nützt Dir ein Listener in einer Konsolenanwendung nichts. Du kannst aber doch (quasi prozedural) selbst eine Methode aufrufen, wenn Du den Datensatz hinzufügst.

Luckie 19. Sep 2008 08:04

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
In Delphi kann ich doch auch beliebige Klassen mit Ereignissen ausstatten? Ob das jetzt Sinn ergibt, so mal dahingestellt. Es dient nur dem Verständnis bzw. der Übung.

DeddyH 19. Sep 2008 08:09

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Da muss ich im Moment leider passen, könnte aber heute Abend nochmal einen Blick in meine alten Sourcen und Bücher werfen, falls bis dahin niemand zur Erleuchtung beigetragen hat.

Angel4585 19. Sep 2008 08:10

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Da mal lesen: How to write an Action Listener

Luckie 19. Sep 2008 08:11

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Ich glaube, da shabe ich gesucht. Danke für den Link.

Angel4585 19. Sep 2008 08:18

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Alternativ das da(ist unterhalb des anderen): Lesson: Writing Event Listeners

Edit: Iss ja die gleiche Seite nochmal :wall:

Luckie 19. Sep 2008 08:27

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Hm, so ganz komme ich damit noch nicht zu recht. da scheint immer irgendwie die Hälfte in der Erklärung zu fehlen. Und das Beispiel bezieht sich schon wieder auf fenster.

Angel4585 19. Sep 2008 08:44

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Hmm.. :gruebel: An dieser Stelle muss ich an das Java-Forum verweisen in dem ich mich immer mal rumtreibe: Java-Forum.org
Da hab ich den Thread gefunden: Change Listener
Allerdings ist das ne alte Java-Version wie mir scheint, aber vllt hilft dir das weiter

Luckie 19. Sep 2008 08:49

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Jupp, ich werde dannauch mal in einem Java-forum fragen.

xaromz 19. Sep 2008 09:10

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Hallo,

ich habe neulich meine eigene Implementierung geschrieben. Dieser kann man einen Methodennamen übergeben (ähnlich wie in Actionscript). Die Standardereignisse sind nämlich in Java ein ziemlicher Mist. Ich kann am Montag mal fragen, ob Du den haben kannst (wenn Du willst). Dann hätte ich auch endlich einen Grund, das Ganze zu dokumentieren :mrgreen: .

Gruß
xaromz

Luckie 19. Sep 2008 09:25

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Bevor ich was eigenes implementiere, wollte eigentlich erstmal den üblichen Java Wg implementieren.

memphis 19. Sep 2008 19:26

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Hallo,

ich würde es mit dem Observer-Pattern lösen (Die EventListener bzw. ActionListener sind im Grunde genau das selbe, nur eben speziell an Swing/AWT Komponenten angepasst).

Als erstes definierst du dir ein Interface (den sogenannten Listener), welches deine Ereignisse beinhaltet:

Code:
interface KundeListener{
    public void onAddKonto(Kunde source); //event. auch eine eigene Klasse KundeEvent als Parameter
    (...)
}

Deine Klasse Kunde ergänzt du um zwei Methoden, welches es dir erlauben einen KundeListener zu registrieren bzw. zu entfernen:

Code:
class Kunde{

(...)

       private Vector<KundeListener> listeners = new Vector<KundeListener>();

   public void addKundeListener(KundeListener listener) {
      listeners.add(listener);
   }

   public void removeKundeListener(KundeListener listener) {
      listeners.remove(listener);
   }

        //alle registrierten Listener benachrichtigen
   private void fireAddKontoEvent() {
      Iterator<KundeListener > iter = listeners.iterator();
      while (iter.hasNext()) {
         ((KundeListener ) iter.next()).onAddKonto(this);
      }
   }

}
Bei deiner AddKonto Methode löst du das Event aus, in dem du alle registrierten Listener benachrichtigst:

Code:
   /*
    * Konto dem Kunden hinzufügen  
    */   
   public void addKonto(Konto konto)
   {
      _konten.add(konto);
      fireAddKontoEvent();
   }
Damit hast du eigentlich schon das Observer-Pattern implementiert. Nun ist es möglich, einen eigenen KundeListener zu implementieren und zu registrieren.

Code:

public class testKunde implements KundeListener

    public void main(String args[]){
         Kunde kunde = new Kunde();
         kunde.addKundeListener(this);
         kunde.addKonto(new Konto());
    }

   public void onAddKonto(Kunde source){
         System.out.println("Neus Konto zu Kunde " + source.getName() + " hinzugefügt..");
   }

}

Der Quellcode ist nicht getestet, dürfte aber vom Prinzip her stimmen (ich hoffe deine Java-Kenntnisse reichen aus..).
Wenn du willst, kann ich dir nach dem Wochenende auch ein komplettes Beispiel hochladen.


Schönen Abend,
lukas.

Luckie 19. Sep 2008 20:50

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Genau das war es, was ich gesucht habe. Besten Dank. :thumb:

Luckie 25. Sep 2008 08:59

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
So, habe endlich mal Zeit gefunden da weiter zu machen.

Code:
/*
 * Interface des Ereignisses
 */ 
interface KundeListener{
    public void onAddKonto(Kunde source);
}

public class Kunde
{
   private String _name;
   private String _vorname;
   private ArrayList _konten;
   // Array für die Ereigniss Registrierungen
   private Vector<KundeListener> listeners = new Vector<KundeListener>();
Jetzt kommt leider die Fehlermeldung:
Zitat:

Der Typ "Vector<KundeListener>" kann nicht gefunden werden.

Angel4585 25. Sep 2008 09:10

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
versuch mal

Code:
private Vector<KundeListener> listeners = new Vector()<KundeListener>;
also am ende einfach () vor das <>

Edit:Ich glaub das <> am ende braucht man garnicht, das reicht glaub beim ersten :gruebel:

Luckie 25. Sep 2008 09:15

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Wenn ich die Klammern nach vorne ziehe, meckert er über das Semikolon am Ende der Zeile. Er unterkringelt mir auch das erste Vektor. Aber import java.util.Vector; habe ich im Quellcode drin.

xaromz 25. Sep 2008 09:23

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Hallo,

Du musst java.util.Vector einbinden. Und vergiss das mit den Klammern, Dein Code ist schon richtig.

Gruß
xaromz

Angel4585 25. Sep 2008 09:33

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Zitat:

Zitat von Angel4585
Edit:Ich glaub das <> am ende braucht man garnicht, das reicht glaub beim ersten :gruebel:

Und funzt das?

Ums dir mal in Delphi zu erklären:
Du Deklarierst einen zeiger der auf ein TBeispielrecord zeigt.
Du musst aber einfach nur einen einfachen Zeiger erzeugen.

Also einfach
Code:
private Vector<KundeListener> listeners = new Vector();
Edit: @Luckie: Was für eine IDE verwendest du eigentlich? Ich kann nur NetBeans empfehlen ist auch für den Umstieg von der Delphi IDE angeblich am besten

Luckie 25. Sep 2008 09:39

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Zitat:

Zitat von xaromz
Du musst java.util.Vector einbinden.

Habe ich.

Zitat:

Und vergiss das mit den Klammern, Dein Code ist schon richtig.
Welcher? Mein ursprünglicher?

Trotzdem meckert er über das erste Vector<KundeListener>, dass er den Typ nicht finden kann. Er scheint das Interface gar nicht zu sehen, was aber in der gleichen datei vor der Klasse definiert ist:
Code:
import java.util.Vector;

/*
 * Interface des Ereignisses
 */ 
interface KundeListener{
    public void onAddKonto(Kunde source);
}

public class Kunde
{
   private String _name;
   private String _vorname;
   private ArrayList _konten;
   // Array für die Ereigniss Registrierungen
   private Vector<KundeListener> listeners = new Vector();

Angel4585 25. Sep 2008 09:43

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Zitat:

Zitat von Luckie
Trotzdem meckert er über das erste Vector<KundeListener>, dass er den Typ nicht finden kann. Er scheint das Interface gar nicht zu sehen

Findet er den Vector nicht oder den KundeListener?

Edit:
Du musst das Interface in einer Datei namens KundeListener.java definieren
Edit2: Oder innerhalb der Kunde Klasse

Edit3: Also zB so:
Code:

public class Kunde{ 


  interface KundeListener{
    public void onAddKonto(Kunde source);
  }
}

Luckie 25. Sep 2008 09:50

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Innerhalb der Klasse hatte ich das Interface auch schon mal. Da hat er es aber trotzdem nicht gefunden. Ich werde es jetzt mal mit einer Datei probieren, obwohl ich das vermeiden wollte den Code über unzählige Dateien zu verstreuen.

Nein, macht auch keinen Unterschied.

Angel4585 25. Sep 2008 10:09

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Das funzt bei mir einwandfrei, keine Probleme beim compilieren oder sonstwo:

Code:
import java.util.Vector;

/**
 *
 * @author M.Weber
 */
public class Kunde {

    private Vector<KundeListener> listeners = new Vector<Kunde.KundeListener>();
   
    interface KundeListener{
        public void onAddKonto(Kunde source);
    } 

}
Das geht ebenfalls:
Code:
import java.util.Vector;

/**
 *
 * @author M.Weber
 */
interface KundeListener {

    public void onAddKonto(Kunde source);
}

public class Kunde {

    private Vector<KundeListener> listeners = new Vector<KundeListener>();
}
Edit: Hast du mehrere Fehler oder nur den einen?
Wenn du mehrere drin hast musst du unten anfangen zu korrigieren ;)

memphis 25. Sep 2008 10:21

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Hallo.
Müsste eigentlich funktionieren, da wie Angel4585 bereits gesagt hat, in beiden Fällen das Interface für die Klasse Kunde sichtbar ist.
Kopier bitte mal den gesamten Code, dann kann ich ihn testen.

Kleine Anmerkung:
Generics werden erst mit Java 5 unterstützt, bist du dir sicher dass du auch min jdk 1.5 hast?

Zitat:

Zitat von Angel4585
Edit: @Luckie: Was für eine IDE verwendest du eigentlich? Ich kann nur NetBeans empfehlen ist auch für den Umstieg von der Delphi IDE angeblich am besten

Als IDE kann ich Eclipse wärmstens empfehlen. Und es ist in Java auch üblich, dass man den Code (besonders Interfaces) über mehrere Dateien verteilt.

grüße, lukas.

Luckie 25. Sep 2008 10:28

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Ich nutze in der Firma und in der Schule das VS von Microsoft und zu Hause die kostenlosen Express Versionen davon. gegen was für eine Java Version der jetzt kompiliert kann ich nicht sagen.

Angel4585 25. Sep 2008 10:31

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Zitat:

Zitat von Luckie
Ich nutze in der Firma und in der Schule das VS von Microsoft und zu Hause die kostenlosen Express Versionen davon. gegen was für eine Java Version der jetzt kompiliert kann ich nicht sagen.

Das muss man irgendwo einstellen können, installier mal das aktuellste jdk un schau wo du das in VS( :kotz: ) einstellen kannst

memphis 25. Sep 2008 10:37

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Oder die Version des installierten jdk mit
Code:
javac -version
herausfinden. Sollte sie wirklich < 1.5 sein, kann ich dir auch eine Version ohne Generics basteln.

Luckie 25. Sep 2008 10:40

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Also installiert ist 1.5.

Angel4585 25. Sep 2008 10:42

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Wäre es möglich das VS das einfach nicht kennt? :gruebel:
Ich würde dir wirklich empfehlen die IDE zu wechseln :duck:

Luckie 25. Sep 2008 10:46

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Er kennt ja import java.util.Vector;.

Und ich werde die IDE nicht wschseln. Die habe ich zu Hause, in der Schule und in der Firma zu Verfügung. was ich von Eclipse oder NetBeans nicht behaupten kann.

memphis 25. Sep 2008 11:14

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
An der IDE scheitert es nicht (die benutzen alle javac als compiler..). Am besten du postest/schickst den gesamten Quellcode, dann teste ich ihn am Nachmittag/Abend.

Luckie 25. Sep 2008 11:23

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe jetzt einfach eine ArrayList genommen. Jetzt komme ich allerdings mit dem zweiten teil nicht ganz klar, ich verstehe ihn nicht:
Code:
public class testKunde implements KundeListener

    public void main(String args[]){
         Kunde kunde = new Kunde();
         kunde.addKundeListener(this);
         kunde.addKonto(new Konto());
    }

   public void onAddKonto(Kunde source){
         System.out.println("Neus Konto zu Kunde " + source.getName() + " hinzugefügt..");
   }

}
In Delphi würde ich es so machen:
Delphi-Quellcode:
procedure TForm1.OnAddKunde(Sender: TObject);
begin
  // ...;
end;

kunde.OnAddKunde := OnAddKunde;
In Java steht da jetzt:
Code:
kunde.addKundeListener(this);
Woher weiß das Ding jetzt, dass bei dem eintretenden Ereignis die Methode
Code:
public void onAddKonto(Kunde source){
         System.out.println("Neus Konto zu Kunde " + source.getName() + " hinzugefügt..");
   }
ausgeführt werden soll?

Jupp, ich habe es mal angehangen. Hinzukommt, dass ich this nicht nutzen kann an dieser Stelle:
Code:
kunde1.addKundeListener(this);
weil meine Klasse statisch ist:
[code]public static void main(String[] args)
{[/code}

memphis 25. Sep 2008 12:00

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

anbei die Klasse Program, habe sie geändert und müsste funktionieren.
- in der statische Methode main wird die Klasse Program instanziert, dadurch müssen die Methoden nicht mehr statisch sein und du kannst this als Referenz verwenden.
- Die Klasse Program muss das Interface KundenListener implementieren (sie registriert sich ja als KundenListener ).

eine eventuell ausführlichere Beschreibung kann ich erst am Abend geben, hoffe es hilft dir inzwischen weiter.

lukas.

Luckie 25. Sep 2008 12:09

Re: [Java] Ereignisse auslösen und auf selbige reagieren
 
JAAAAAA. Perfekt. Funktioniert. :thumb: Mein aller besten Dank für deine Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz