Mein TableEvent problem

may24

Bekanntes Mitglied
Hi zusammen,

Ich bin mir zwar (fast) sicher das diese Frage des öfteren hier auftaucht aber wie die Frage formulieren damit sie die Forumssuche versteht ... ;(

Na ja, wie auch immer hier nun das eigentliche Problem:
Ich bastele seit Tagen an einem Programm das verschiedene Werte aufnimmt, sie anhand einer speziellen Formel verrechnet und zum guten Schluß das Ganze in einer Tabelle wiedergibt.
Läßt man mal die ganzen Spielereien weg und konzentriert man sich auf's wesentliche so ist die Aufgabe wie folgt:

Es gibt drei voneinander unabhängige Objekte. Diese bestehen je aus einem JFrame, JTextField und einem JButton ("submit").

Wird nun über ein JTextField ein wert eingetragen und per Button (ActionEvent) "submitted" so nimmt erst einmal das entsprechende Object den Wert entgegen, verrechnet ihn und speichert Anfangs und Endwert in seinem JTable.
Doch damit niocht genug. Der eingelesene Wert muß and die anderen beiden Objekte weitergegeben werden die dan ihrerseits einen Wert berechnen und Anfangs + Endwert in ihren JTables speichern.

Nur wie geht das ?

Meide Idee ist, das wenn der erste JTable sich ändert, eine TableEvent von changeTableData auftritt.
Dieses Event muß den anderen Objekten irgentwie mitgeteilt werden plus dem eingelesenen Wert.
Wenn ein anderes Fenster das tut, muß es wiederum an die anderen beiden weitergeleitet werden.

Da das Ganze als eine Applikation auf nur einem Rechner läuft braucht man sich erst mal keine Sorgen um Syncronisation zu machen. So schnell ist niemand mit der Maus als daß die Events kollidieren könnten ...

Leider hab ich noch keinen Code zu der Geschichte gebastelt, da ich erst gar nicht weiß wo ich anfangen soll. ???:L
 
Das ist nicht ganz der richtige Ansatz. Normalerweise baut man seine Applikation nach dem MVC-Pattern. Im Model kannst du die Input- und Outputdaten speichern und berechnen. Die View zeigt - logischerweise - das GUI an. Der Controller ist das Zwischenstück, welcher die Kommunikation zwischen beiden Stücken regelt. Aber eigentlich muss dich das nicht im Detail erwähnen, denn da gibts genügend Literatur dazu 🙂
 
Du musst deine eigentlichen Business Daten von der View entkoppeln. Stichwort MVC. Das bedeutet, dass deine Daten nicht unmittelbarer Bestandteil der jeweiligen Table(s) sein dürfen, sondern in einer eigentständigen, externen Struktur gespeichert sind:

Java:
public class BusinessModel{
    // hier hast du nun zB ne ArrayList für deine Daten, und Methoden á la addData/removeData/getData
}

Dann noch ein ListenerInterface dafür

Java:
public interface BusinessModelListener{

   public void businessDataAdded(Data d);
   public void businessDataRemoved(Data d);
}

In der Business-Model Klasse hälst du eine Liste solcher BusinessModelListener, und stellst zwei Methoden bereit um nen Listener zu adden und zu löschen. Wann immer sich was am BusinessModel ändert, d.h. es wurde addData/removeData aufgerufen, iterierst du in diesen Methoden über alle Listener die registriert wurden und rufst die im Interface definierte Methode auf.

Soweit hat das erstmal nix mit Tables zu tun. Du hast jetzt einfach eine Datenstruktur, welche deine Business Daten speichert, und kannst über das Listener-Interface beliebige Instanzen deiner Applikation dort registrieren, damit sie über Änderungen benachrichtigt werden und dann jeweils irgendwie darauf reagieren können.

Für die einzelnen Tables implementierst du dann nun ein TableModel, welches das BusinessModel auf den JTable mappt. Außerdem implementieren diese TableModels das BusinessModelListener Interface. In deiner Applikation registrierst du diese Models dann am BusinessModel. Ein Beispiel für einen Table würd dann so aussehen:

Java:
public class Table1Model extends DefaultTableModel implements BusinessModelListener{
 
        @Override
        public void businessDataAdded(Data d){
            add(d); // == super.add(d) == DefaultTableModel#add(Object)
        }

        public void businessDataRemoved(Data d){
            remove(d); // == super.remove(d) == DefaultTableModel#remove(Object)
        }
}

Du kannst jetzt noch diverse Methoden des DefaultTableModel überschreiben, um zB festzulegen wieviel Spalten die Table hat, wie du Spalten heißen, usw.

D.h. der einzige Unterscheid zwischen den 3 TableModels ist dass sie halt die Daten unterschiedlich anzeigen. Du kannst natürlich auch filtern usw, aber dann musst du halt bei businessDataAdded/Removed ne komplexere Logik einbauen und ermitteln ob du diesen Datensatz eigentlich in der jeweiligen Tabelle drin haben willst.

So, und deine Komponente mit JFrame, Textfeld und Submit Button sollte nun unabhängig von irgendeiner Table sein. Sie hat nur ne Referenz auf das BusinessModel und beim submit rufst du halt zB auf:
businessModel.addData(...);

Wenn du die addData Methode in der BusinessModel-Klasse nun so implmentiert hast wie ich oben beschrieben hab, werden automatisch alle 3 Tables darüber benachrichtigt dass es neue Daten gibt. Was sie mit dieser Info anfangne, also wie sie das weiterverarbeiten, entscheidest du eben im jeweiligen TableModel.

Beim Initialisieren deiner App sieht das ganze also etwa so aus:

Java:
BusinessModel businessModel = new BusinessModel();
Table1Model t1Model = new Table1Model();
Table2Model t2Model = new Table2Model();
Table3Model t3Model = new Table3Model();
businessModel.addBusinessModelListener(t1Model);
businessModel.addBusinessModelListener(t2Model);
businessModel.addBusinessModelListener(t3Model);
JTable t1 = new JTable(t1Model);
JTable t2 = new JTable(t2Model);
JTable t3 = new JTable(t3Model);
CreateDataPanel createData = new CreateDataPanel(businessModel);

So in etwa. Man strebt halt einfach eine möglichst lose Kopplung an, also das BusinessModel sollte unabhängig von irgendwelchen Tables funktionieren.
 
Zuletzt bearbeitet:

Zurück
Oben