tutorials.de Buch-Aktion 05/2012
Like Tree4Danke
  • 1 Beitrag von MiMi
  • 1 Beitrag von vfl_freak
  • 1 Beitrag von deepthroat
  • 1 Beitrag von MiMi
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
475
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Collinwood Collinwood ist offline Mitglied Bronze
    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
    Code java:
    1
    2
    
    private BeingContainer beingContainer; // beerbt eine ArrayList<Being> //Being = andere, eigene Klasse
    private SimulationComposite simulationComposite; //ist ein SWT-Composite
    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
    3
    
    System.out.println("Größe der Liste beingContainer in dieser Klasse: "+this.beingContainer.size());
            this.simulationComposite.setBeingList(this.beingContainer);
            System.out.println("Liste wurde übergeben...");
    Ausgabe dessen lautet (z.B.):
    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:
    Code java:
    1
    
    SimulationComposite.this.getBounds().width / 2
    statt
    Code java:
    1
    
    SimulationComposite.this.getDisplay().getBounds().width / 2
    war die Lösung.


    Dankeschön vorab,
    Collinwood
    Geändert von Collinwood (09.12.10 um 18:49 Uhr) Grund: Das kleine Problem ist behoben..!
     

  2. #2
    MiMi MiMi ist offline Mitglied Smaragd
    Registriert seit
    Sep 2007
    Beiträge
    1.177
    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
    Collinwood bedankt sich. 
    Waere super wenn ihr euren Code in dieser Form einfuegt:
    [JAVA]System.out.println("Test :)");[/JAVA]
    wird zu:
    Code java:
    1
    
    System.out.println("Test :)");
    Tabs sind uebrigens keine Feinde :)
    Der "Erledigt Button" beisst net :) Und der "Danke Button" ist auch nicht nur zur zierde
    Danke :D

  3. #3
    Collinwood Collinwood ist offline Mitglied Bronze
    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);
     

  4. #4
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    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ß
    Klaus
    Collinwood bedankt sich. 
    Es 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 !!

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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ß
    Collinwood bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    MiMi MiMi ist offline Mitglied Smaragd
    Registriert seit
    Sep 2007
    Beiträge
    1.177
    Bevor du die set-methode aufrufst, ist doch dieses hier:
    Code java:
    1
    2
    
        this.beingList = new ArrayList<Being>();
          initialize();
    Somit wird auch nur vor der set-methode initialize aufgerufen und auch nur einmal die paintControl?
    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?
    Collinwood bedankt sich. 
    Waere super wenn ihr euren Code in dieser Form einfuegt:
    [JAVA]System.out.println("Test :)");[/JAVA]
    wird zu:
    Code java:
    1
    
    System.out.println("Test :)");
    Tabs sind uebrigens keine Feinde :)
    Der "Erledigt Button" beisst net :) Und der "Danke Button" ist auch nicht nur zur zierde
    Danke :D

  7. #7
    Collinwood Collinwood ist offline Mitglied Bronze
    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:
    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);
    Soweit steht fest dass ich mit dem selben Objekt arbeite.

    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 aus
    Code java:
    1
    
    this.simulationComposite.setBeingList(this.beingContainer);
    aufrufe und meine Liste übergebe. Es funktioniert scheinbar tadellos.

    Das Problem ist nur, dass ich das ganze dann gerne zeichnen möchte. Dessen Überprüfung leite ich ja dann in SimulationComposite mit
    Code java:
    1
    
    if (!SimulationComposite.this.getBeingList().isEmpty()) {
    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.

    Wie gesagt, die Debugger-Screenies sind am interessantesten.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Liste nach Übergabe leer, warum?-1.jpg   Liste nach Übergabe leer, warum?-2.jpg  

    Liste nach Übergabe leer, warum?-3.jpg   Liste nach Übergabe leer, warum?-4.jpg  

    Liste nach Übergabe leer, warum?-5.jpg  
     

  8. #8
    Collinwood Collinwood ist offline Mitglied Bronze
    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:
    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;
        }
     
    }
    Im Anhang ist ein aktueller Screenshot der Applikation. Es funktioniert ja schön, aber ich möchte das nicht mit dem static-****** Das wirft das gesamte OO-Konzept übern Haufen, dafür studier ich nicht.

    Ich freu mich schon auf weitere Antworten, bin euch sehr dankbar!
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Liste nach Übergabe leer, warum?-progscreen.jpg  
     

  9. #9
    Collinwood Collinwood ist offline Mitglied Bronze
    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

  1. Sessions nach header leer
    Von PHP_USER123 im Forum PHP
    Antworten: 6
    Letzter Beitrag: 15.11.10, 15:34
  2. Liste übergabe und Sort befehl
    Von FJK im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 27.09.09, 17:47
  3. Antworten: 3
    Letzter Beitrag: 10.09.07, 19:50
  4. desktop nach neustart leer...
    Von sucker77 im Forum Security (Viren, Trojaner, Spam)
    Antworten: 10
    Letzter Beitrag: 31.08.07, 20:01
  5. Nach fwrite ist die Datei leer
    Von JSchreiber im Forum PHP
    Antworten: 4
    Letzter Beitrag: 04.08.04, 11:30

Stichworte