Zum Inhalt springen

Klassenverknüpfung bei non-static Klassen


madbat

Empfohlene Beiträge

Hallo,

ich sitze mal wieder vor einem Problem,

ich habe in meinem Programm mal eine strikte Trennung zwischen non-Gui und Gui elementen vorgenommen, die Strucktur sieht jetzt in etwa so aus:

  • ProjectName

    • MainNonGui.java(enthällt public static main)
    • MainGui.java

  • ProjectName.GUI

    • ProjectName.GUI.contentPane

      • ContentPane.java(Ich enthalte eine JTextArea)
      • ...

  • ProjectName.GUI.Irgendwas anderes Pane
  • ...

  • ProjectName.NonGui

    • ProjectName.NonGui.Methoden

      • IchSollwasIndieJTextAreaVonContentPaneSchreiben.java
      • ...

  • ...

so jetzt ist das alles non-static aufeiander aufgebaut, sodass ich die klassen zum output nicht direkt anwählen kann, deshalb speichere ich sie momentan ebend jeweils in dem parentFile als public ein, und wenn ich was ansprechen will muss ich immer über die main class gehen davon eine verlinkung zur GUI Klasse haben und davon eine Verlinkung auf das GUI element was ich ansprechen will, das ist aber teilweise bis zu 4 Ebenen drunter und irgendwie werden mir die 'Links' zu lang.

Die andere Idee war eine Klasse Variablen zu erstellen, die alles static abspeichert, sodass ich nachher nur auf MainNonGUI.variablen.contentpane.setText("Sooo"); zugreifen müsste, das kam mir aber irgendwie auch nicht so sonderlich schön vor.

Gibt es nicht irgendwie eine andere Methode das zu realisieren, wie löst man sowas denn als "Profi"?

Grüße

madbat

Bearbeitet von madbat
Link zu diesem Kommentar
Auf anderen Seiten teilen

Man löst so etwas über Events / Listener bzw unter Qt kennt man das als Signal-Slot-Mechanismus. Klassen der GUI registrieren ein Event z.B. onClick an deinem Eventhandler, andere Klassen "hören" an diesem, d.h. sobald die Methode onClick des Eventhandlers aufgrufen wird, wird eben eine bestimmte Methode jeder Klasse ausgeführt, die irgendetwas durchführt. Umgekehrt, wenn so eine Methode beendet wird, schickt sie an einen Eventhandler das Signal "fertig" und dort können dann ggf GUI Elemente angedockt sein, die das Ergebnis darstellen.

Das ganze würde man eben mit abstrakten Klassen lösen, so dass man eben die Arbeiterklassen entsprechend vorher ableiten muss

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich kann dir nicht ganz folgen, ich weiss wie ich eventlistener dazu bringe mir nen popup zu zeigen, oder auf buttons etc zu reagieren, aber wie bringe ich sie dazu über klassen hinweg miteinander zu kommunizieren, reicht es qwenn ich einfach zu der contentpane einen action(?)Listener adde und dann in meiner nonGUI class ein new actionEvent(textZumSchreiben evt) erstelle?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, Du musst die gesamte Logik für Deine Listener und Eventhandler selbst implementieren. Es wäre sinnvoll wenn Du sobald Dein Programm gestartet wird eben ein Objekt Deiner Eventstruktur erzeugst an dem sich dann alle anderen Objekte registrieren können.

Java kennt Deine Events nicht, d.h. Du kannst mit den Standardevents nichts anfangen

Link zu diesem Kommentar
Auf anderen Seiten teilen

soo ich habe mir da jetzt mal was zusammengedichtet, die frage ist, habe ich jetzt alle aufgaben richtig verteilt, wobei die system out methode hierbei jetzt für das füllen vom textfeld verantwortlich ist,

also es klappt alles, ich weiss nur nicht ob alles an der richtigen stelle steht...

package de.test;

public interface ListenKlass {

public void printInt(EventKlass evt);

}
package de.test;

public class EventKlass {

int wert;

public EventKlass(int i){
this.wert = i;
}

}
package de.test;

public class Ebene1Class1 {

ListenKlass lk;
int wert;

public Ebene1Class1(ListenKlass lk, int i) {
this.lk = lk;
this.wert = i;
}

public void printOut(){
lk.printInt(new EventKlass(wert));
}


}
public class MainClass {

/**
* @param args
*/
public static void main(String[] args) {
ListenKlass LK = new ListenKlass(){

@Override
public void printInt(EventKlass evt) {
System.out.println(evt.wert+"");
}
};
Ebene1Class1 eins = new Ebene1Class1(LK, 14);
eins.printOut();
System.out.println("\n");
Ebene1Class1 zwei = new Ebene1Class1(LK, 12);
zwei.printOut();
}

}[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke das Grundprinzip ist schon von Dir richtig umgesetzt.

Jetzt kann man je nach Komplexität auch evtl passende Generalisierungen bauen z.B. dass jede GUI Klasse Deine Listener und Event Klasse implementiert. Damit würde das Property in Deiner Eventklasse wegfallen.

Als Pseudocode würde man das evtl so machen, wobei man das Event- und Listenerobjekt zentral hält (hierbei vor allem bei Multithreadanwendung auf richtige Synchronisierung achten)

Ich würde das (im Pseudocode) so implementieren



public class abstractevent {

public eventAction(action p);

}



public class Event implements abstractevent{

     Arraylist list;


public registerobject(Object x) {

     list.push(x);

)


public unregister(object x) {

    list.pop(x);

}


public eventAction(action p) {

    foreach(y in list)

       y.action(p);

}

}



public myobject implements abstractevent {

  public myobject {

     globalevents.register(this);

}     


public delete {

     globalevents.unregister(this);

}


public fireevent{

      globalevent.eventaction("test event");

}



public eventAction(action p) {

            do somesthing on event

    }

}


Das wäre so mein Aufbau, den man natürlich beliebig verfeinern kann

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab da sganze mit den Events und Listenern immer noch nicht ganz verstanden, irgendwie ist mir das ganze System fremd,

auch nach mehrmaligen Lesen der javaInsel bin ich noch nicht dahinter gestiegen warum es denn jetzt zwar im Test so funktioniert

wie es soll, aber im richtigen System nicht...

Falls jemand also nen gutes Tut zu den Anfängen von eigenen Eventhandlern hat, dann immer her damit...

Also ich wollte meine Events nicht ganz so abstrakt einbauen, weil ich leider nicht ganz verstanden habe welche Klasse bei dir

für was genau zuständig ist, hier mal meine implementiern:


public class ListenSetOutput {

ContentPanel parent;

public ListenSetOutput(ContentPanel parent){
this.parent = parent;
}

public void echo(String txt){
parent.echo(parent.getTxt() + txt);
}

public void cls(){
parent.cls();
}

}
[/PHP]

[PHP]
//Aus der MainGui Klasse, hab einfach mal auf nen menuItem die action setText druffgeknallt
//MainGui ruft sämtliche Klassen auf, die etwas mit der GUI zu tun haben, und wird selber nur von
//der Main Non-Gui Klass aufgerufen, die nachher noch die ganzen Methoden etc aufruft...
[...]
public ListenSetOutput listenSetText = new ListenSetOutput(contentPanel);
@Action
public void setText() {
listenSetText.echo("test Event");
}
[...]


public class ContentPanel extends javax.swing.JPanel {

public ContentPanel() {
initComponents();

}

public void echo(String txt){
txtOutput.setText(txtOutput.getText()+txt);
//jScrollPane1.getVerticalScrollBar().setValue(jScrollPane1.getVerticalScrollBar().getMaximum());
}

public void cls(){
txtOutput.setText("");
}

public String getTxt(){
return txtOutput.getText();
}

@SuppressWarnings("unchecked")
private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();
txtOutput = new javax.swing.JEditorPane();

setName("Form");

jScrollPane1.setName("jScrollPane1");

org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(ibm2.IBM2App.class).getContext().getResourceMap(ContentPanel.class);
txtOutput.setContentType(resourceMap.getString("txtOutput.contentType"));
txtOutput.setText(resourceMap.getString("txtOutput.text"));
txtOutput.setComponentPopupMenu(new ibm2.GUI.popupMenu.CopyPaste(txtOutput)
);
txtOutput.setName("txtOutput");
jScrollPane1.setViewportView(txtOutput);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 544, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE)
);
}


private javax.swing.JScrollPane jScrollPane1;
private static javax.swing.JEditorPane txtOutput;

}[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...