madbat Geschrieben 25. Februar 2010 Teilen Geschrieben 25. Februar 2010 (bearbeitet) 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: ProjectNameMainNonGui.java(enthällt public static main)MainGui.javaProjectName.GUIProjectName.GUI.contentPaneContentPane.java(Ich enthalte eine JTextArea)...ProjectName.GUI.Irgendwas anderes Pane...ProjectName.NonGuiProjectName.NonGui.MethodenIchSollwasIndieJTextAreaVonContentPaneSchreiben.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 25. Februar 2010 von madbat Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 25. Februar 2010 Teilen Geschrieben 25. Februar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
madbat Geschrieben 25. Februar 2010 Autor Teilen Geschrieben 25. Februar 2010 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 25. Februar 2010 Teilen Geschrieben 25. Februar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
madbat Geschrieben 26. Februar 2010 Autor Teilen Geschrieben 26. Februar 2010 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] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 26. Februar 2010 Teilen Geschrieben 26. Februar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
madbat Geschrieben 2. März 2010 Autor Teilen Geschrieben 2. März 2010 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] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.