4Danke
ERLEDIGT
JA
JA
ANTWORTEN
8
8
ZUGRIFFE
475
475
EMPFEHLEN
-
09.12.10 18:42 #1
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Hallo Leute, ich steh hierbei total im Wald

Hoffe, ihr blickt durch und könnt mir helfen.
Ich habe da in einer Klasse meine Attribute
und ich komme dann in einer meiner Methoden an den Punkt wo ich die o.g. Liste/Container mit meinen "Beings" darin an das Composite übergeben möchte:Code java:1 2
private BeingContainer beingContainer; // beerbt eine ArrayList<Being> //Being = andere, eigene Klasse private SimulationComposite simulationComposite; //ist ein SWT-Composite
Ausgabe dessen lautet (z.B.):Code java:
Größe der Liste beingContainer im LifeController: 42
Liste wurde übergeben...
Der Code im Composite sieht folgendermaßen aus:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
package view; import java.util.ArrayList; import model.Being; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; /** * @author Tobias Keiler * @date 09.12.2010 */ public class SimulationComposite extends Composite { /** * @Description */ private ArrayList<Being> beingList; /** * @param parent * @param style */ public SimulationComposite(Composite parent, int style) { super(parent, style); this.beingList = new ArrayList<Being>(); initialize(); } /** * */ private void initialize() { setSize(new Point(800, 470)); setLayout(null); this.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent arg0) { //FIXME syso System.out.println("Größe der Liste beingContainer im SimulationComposite: "+SimulationComposite.this.beingList.size()); if (!SimulationComposite.this.getBeingList().isEmpty()) { //FIXME syso System.out.println("Liste voll"); for (Being being : SimulationComposite.this.getBeingList()) { // Rectangle rect = // SimulationComposite.this.getClientArea(); arg0.gc.drawOval(being.getPosition().getX(), being .getPosition().getY(), 1, 1); } } else { //FIXME syso System.out.println("Liste leer"); arg0.gc .drawString("Simulation ist unterbrochen...", SimulationComposite.this.getDisplay() .getBounds().width / 2, SimulationComposite.this.getDisplay() .getBounds().height / 2); } } }); } /** * @Description //TODO Describe this one! * @param beingList */ public void setBeingList(ArrayList<Being> beingList) { this.beingList = beingList; } /** * @Description //TODO Describe this one! * @return //TODO */ public ArrayList<Being> getBeingList() { return this.beingList; } } // @jve:decl-index=0:visual-constraint="10,10"
... und als Ausgabe bekomme ich zu diesem Objekt zu meinem Erstaunen immer nur:
Größe der Liste beingContainer im SimulationComposite: 0
Liste leer
Mal abgesehen von diesem größeren Fehler, wird zwar der Else-Zweig in der paintControl-Methode durchlaufen, aber den gewünschten String "Simulation ist unterbrochen..." hab ich auch noch nie gesehen!! Wer mir also sagen kann wo es da noch hängt, bitte gerne.
Edit: Hierzu hab ich die Lösung gefunden:
stattCode java:1
SimulationComposite.this.getBounds().width / 2
war die Lösung.Code java:1
SimulationComposite.this.getDisplay().getBounds().width / 2
Dankeschön vorab,
CollinwoodGeändert von Collinwood (09.12.10 um 18:49 Uhr) Grund: Das kleine Problem ist behoben..!
-
1. Tipp wenn was nicht so ist, wie es sein sollte, den debugger nutzen

2.
this.beingList = new ArrayList<Being>();
initialize();
So kann sie nur leer sein
Da du ja hier ne neue (leere) Liste erstellst
Waere super wenn ihr euren Code in dieser Form einfuegt:
[JAVA]System.out.println("Test :)");[/JAVA]
wird zu:
Tabs sind uebrigens keine Feinde :)Code java:1
System.out.println("Test :)");
Der "Erledigt Button" beisst net :) Und der "Danke Button" ist auch nicht nur zur zierde
Danke :D
-
09.12.10 22:14 #3
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
1. Danke für den Tipp
Aber in dem Fall seh ich ja auch durch den Debugger einfach nur den Aufruf der nichts bewirkt hat 
2. Öhm... schon klar, dass ich da ne neue erstelle. Das mach ich ja auch absichtlich im Konstruktor - danach lebt dieses Objekt ja. Ich lasse genau dieses Objekt bereits in der Klasse mit der void Main an das "Benutzerobjekt" übergeben, und greife ja dann mit set... darauf zu. Diesen Aufruf mit new... würd ich ja generell immer gerne weglassen, aber mit nicht-initialisierten Listen gibts leider immer null-pointer-Exceptions. Also irgendwo MUSS ich ja new sagen... oder? Klar, = null geht auch, aber hat das nicht dieselbe Auswirkung... nochmal: Das Objekt ist bereits konstruiert und lebt, danach wird nix mehr überschrieben.... ich bin leider so schlau wie vorher.
Hier der Auszug aus der Main-Methode
Code java:1 2 3
MainFrame mainFrame = new MainFrame(shell, SWT.NONE); mainFrame.setSize(shell.getBounds().width,shell.getBounds().height); LifeController lifeController = new LifeController(mainFrame.getSimulationComposite(),mainFrame.getOptionComposite(),o,display);
-
10.12.10 07:59 #4
Moin,
also ich sehe es auch so wie MiMi ...
Du erstellst eine neue leere Liste - und fertig!
Beschreib' mal näher, wo sie Deiner Meinung nach mit konkreten Daten gefüllt werden müsste !
Eine solche Stelle sehe ich in Deinem ersten Post nicht
(und den zweiten habe ich in diesem Zusammenhang nicht verstanden)
Gruß
KlausEs ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!
Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
-------------------------------------------------------------------------------------------------
Ich beantworte keine Fragen per PN !!
Stellt Eure Fragen im Forum - dann haben alle etwas davon !!
-
10.12.10 08:46 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
@Collinwood: Zeig mal den relevanten Code. Insbesondere da wo du die Ausgaben machst.
Bzw. prüfe mal im Debugger wie oft der Konstruktor der SimulationComposite Klasse aufgerufen wird (sollte ja nur einmal passieren?!). Oder erzeugst du in mainFrame.getSimulationComposite() jedesmal ein neues Objekt?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Bevor du die set-methode aufrufst, ist doch dieses hier:
Somit wird auch nur vor der set-methode initialize aufgerufen und auch nur einmal die paintControl?Code java:1 2
this.beingList = new ArrayList<Being>(); initialize();
Nach dem Aufruf der set-methode, kommt er doch gar nicht mehr in die paintControl-methode? <- sowas koenntest du im debugger pruefen. In welcher Reihenfolge er durch die Methoden geht.
Ablauf:
- neue Liste
- aufruf initialize()
- aufruf paintControl()
- setBeingList
? Oder wird die paintControl immer wieder neu aufgerufen?Waere super wenn ihr euren Code in dieser Form einfuegt:
[JAVA]System.out.println("Test :)");[/JAVA]
wird zu:
Tabs sind uebrigens keine Feinde :)Code java:1
System.out.println("Test :)");
Der "Erledigt Button" beisst net :) Und der "Danke Button" ist auch nicht nur zur zierde
Danke :D
-
10.12.10 09:22 #7
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Hi vfl-freak,
ok ich versuch es step-by-step darzustellen, inklusive allen weiteren Tests die ich bis jetzt unternommen habe.
1. Zunächst der Ablauf der Objekterzeugung vom SimulationComposite:
Soweit steht fest dass ich mit dem selben Objekt arbeite.Code java:1 2 3 4 5 6 7
//In der "Starter-Klasse", innerhalb der Main-Methode: MainFrame mainFrame = new MainFrame(shell, SWT.NONE); //In MainFrame: this.simulationComposite = new SimulationComposite(this.tabFolder, SWT.NONE); //und dieses Objekt übergebe ich wiederum in der Main-Methode an späterer Stelle zusammen mit anderen Objekten, die ich brauche, an den "LifeController": LifeController lifeController = new LifeController(mainFrame.getSimulationComposite(),mainFrame.getOptionComposite(),o,display);
2. Eine Überprüfung durch system-out ergab, dass dieses Objekt definitiv erzeugt wird, bevor es übergeben wurde und ergab des weiteren, dass der Konstruktor definitiv nur einmal durchlaufen wird.
3. Debugger-Screenshots (bitte reinschauen)
Dort habe ich einen Breakpoint gesetzt, wo ich vom LifeController ausaufrufe und meine Liste übergebe. Es funktioniert scheinbar tadellos.Code java:1
this.simulationComposite.setBeingList(this.beingContainer);
Das Problem ist nur, dass ich das ganze dann gerne zeichnen möchte. Dessen Überprüfung leite ich ja dann in SimulationComposite mit
ein. Dieser Zweig wird aber nie durchlaufen. Zusammenfassend gesagt: lifeController-Objekt hat ein simulationComposite-Objekt und diesem kann es mit set..() eine Liste übergeben. Dann kommt es definitiv nach der Listenübergabe zum Codeeintritt wo der Inhalt dieser Liste abgefragt wird (das mache ich grundsätzlich wegen nullpointern). Und dort bekomme ich immer gesagt: Liste leer.Code java:1
if (!SimulationComposite.this.getBeingList().isEmpty()) {
Wie gesagt, die Debugger-Screenies sind am interessantesten.
-
10.12.10 11:33 #8
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Hallo nochmal,
danke auch an die weiteren Antworten von deepthroat und mimi, hatte euch beide gar nicht gesehen, muss wohl während meiner Antwort passiert sein.
@deepthroat: Wie schon beschrieben, das mit den Aufrufen ist gecheckt...
@MiMi: Die initialize() wird korrekterweise ein einziges mal ausgeführt, genauso wie new Arraylist()... danach ist die paintControl in einem stetig lauschenden Zustand und sie funktioniert auch tadellos. Ich kam ja von Anfang an immer in den else-Zweig. Nur die Überprüfung if(listeleer) verhinderte ein fortkommen an der richtigen Stelle. Ich habe mittlerweile, um weiterprogrammieren zu können, die Liste temporär statisch ausgelagert, das zeichnen meiner Objekte funktioniert prima.
aktueller Klassencode:
Im Anhang ist ein aktueller Screenshot der Applikation. Es funktioniert ja schön, aber ich möchte das nicht mit dem static-******Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
package view; import java.awt.Color; import java.util.ArrayList; import model.Being; import options.Options; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; /** * @author Tobias Keiler * @date 09.12.2010 */ public class SimulationComposite extends Composite { /** * @Description */ protected ArrayList<Being> beingList; /** * @Description */ protected ArrayList<Rectangle> rectangleList; /** * @param parent * @param style */ public SimulationComposite(Composite parent, int style) { super(parent, style); this.beingList = new ArrayList<Being>(); this.rectangleList = new ArrayList<Rectangle>(); initialize(); } /** * */ private void initialize() { setLayout(null); this.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent arg0) { //FIXME syso System.out.println("Größe der Liste beingContainer im SimulationComposite: "+getBeingList().size()); //if (!SimulationComposite.this.getBeingList().isEmpty()) { //FIXME wieder wegmachen nur test SimulationComposite.this.rectangleList.clear(); if(!Options.beingList.isEmpty()) { //FIXME syso System.out.println("Liste voll"); //for (Being being : SimulationComposite.this.getBeingList()) { //FIXME wieder wegmachen nur test for (Being being : Options.beingList) { if(being.getAge()<3) { arg0.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED)); } else { arg0.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); } arg0.gc.drawOval(being.getPosition().getX(), being .getPosition().getY(), 10, 10); Rectangle r = new Rectangle(being.getPosition().getX(),being.getPosition().getY(),10,10); SimulationComposite.this.rectangleList.add(r); } } else { //FIXME syso System.out.println("Liste leer"); arg0.gc .drawString("Simulation ist unterbrochen...", SimulationComposite.this .getBounds().width / 2, SimulationComposite.this .getBounds().height / 2); } Listener mouseListener = new Listener() { @Override public void handleEvent(Event event) { switch(event.type) { case SWT.MouseEnter: case SWT.MouseMove: for (Rectangle rectangle : SimulationComposite.this.rectangleList) { if (rectangle.contains(event.x,event.y)) { Being being = Options.beingList.get(SimulationComposite.this.rectangleList.indexOf(rectangle)); String gender = "weiblich"; if(being.isGender()) { gender = "männlich"; } String text = "Alter: "+being.getAge() +"\nSpezies: "+being.getClass().toString() +"\nGeschlecht: "+gender; if(!(text.equals(SimulationComposite.this.getToolTipText()))) { SimulationComposite.this.setToolTipText(text); } return; } } SimulationComposite.this.setToolTipText(null); break; } } }; SimulationComposite.this.addListener(SWT.MouseMove, mouseListener); SimulationComposite.this.addListener(SWT.MouseEnter, mouseListener); } }); } /** * @Description //TODO Describe this one! * @param beingList */ public void setBeingList(ArrayList<Being> beingList) { this.beingList = beingList; } /** * @Description //TODO Describe this one! * @return //TODO */ public ArrayList<Being> getBeingList() { return this.beingList; } }
Das wirft das gesamte OO-Konzept übern Haufen, dafür studier ich nicht.
Ich freu mich schon auf weitere Antworten, bin euch sehr dankbar!
-
10.12.10 16:59 #9
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Problem hat sich erledigt!! Vielen Dank.. habe irgendwo einmal zuviel new() aufgerufen....
Ähnliche Themen
-
Sessions nach header leer
Von PHP_USER123 im Forum PHPAntworten: 6Letzter Beitrag: 15.11.10, 15:34 -
Liste übergabe und Sort befehl
Von FJK im Forum C/C++Antworten: 3Letzter Beitrag: 27.09.09, 17:47 -
Liste in Firefox korrekt, in IE mal wieder falsch - warum?
Von stefanstp im Forum CSSAntworten: 3Letzter Beitrag: 10.09.07, 19:50 -
desktop nach neustart leer...
Von sucker77 im Forum Security (Viren, Trojaner, Spam)Antworten: 10Letzter Beitrag: 31.08.07, 20:01 -
Nach fwrite ist die Datei leer
Von JSchreiber im Forum PHPAntworten: 4Letzter Beitrag: 04.08.04, 11:30





Zitieren
Login





