Rechteck per Mouse aufziehen

  • Themenstarter Themenstarter Sanne
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

Sanne

Gast
Hallo,
ich weiß, dass erfahrende Programmierer mich wegen meines Quelltextes erschießen werden, aber manches davon war auch Vorgabe eines C++ Menschens. Also geht bitte nicht ganz so hart mit mir um. ;-)

So und nun zu meinem Problem. Ich möchte auf einer Grafikausgabefläche ein neues Rechteck aufziehen können, dass dann auch angezeigt wird. Leider tut sich gar nichts, weder kommt eine Fehlermeldung noch wird etwas gezeichnet.

Den Quellcode findet ihr unter http://pastebin.com/516622
Falls die Oberklasse Drawing von Interesse ist http://pastebin.com/516624
Und Figure http://pastebin.com/516625

Ich hoffe es kann mir jemand helfen.

Liebe Grüße Sanne
 
Ok, ich verkneife mir jeden Kommentar zum Code... :wink:

Doch, etwas muss ich sagen: keine statischen Variablen verwenden! Den MouseListener nicht in der main hinzufügen, sondern im Konstruktor des TDrawing (das ist die logische Kapselung: der Listener gehört zum TDrawing, und steht nicht einfach so alleine in der Gegend rum).

Figur erbt von JPanel? Ich halte das für fragwürdig, sie wird ja nie als Panel verwendet...

Zum Fehler, es sind gleich mehrere :bae:
1. Ein Graphics kann man nicht speichern! Jedesmal wenn gezeichnet wird, bekommt man von der VM ein neues Graphics-Objekt, das alte verlierte jeden Einfluss. Die Variable "g" kannst du einfach mal löschen :wink:
Stattdessen speicherst du am besten ob, und wo die Maus gedrückt ist. In der paint-Methode kannst du dann die Figur zeichnen (ein Update kannst du mit "repaint" erzwingen).
2. mouseClicked wird nur aufgerufen, wenn die Maus nicht bewegt wurde. Ich denke, du solltest mouseReleased nehmen.
3. mouseDragged ist Teil des Interfaces "MouseMotionListener", du fügst den Listener jedoch als "MouseListener" hinzu. Du musst den Listener sowohl "addMouseListener" übergeben (für das Drücken und Loslassen der Tasten), sowie der "addMouseMotionListener" (für das Herumfahren).
 
Hi,
danke erst einmal, ein bißchen was kann ich damit schon anfangen. Als erstes stolpere ich allerdings darüber, dass ich doch keinen MouseListener in den Konstruktor schreiben kann, wenn der sich doch auf eine Instanz dieses Konstruktors bezieht. (TDraw wird ja erst noch erzeugt, genauso wie die Labels).

Wahrscheinlich liegt es aber wieder daran, dass ich keine Ahnung von Java habe.

Greetz Sanne
 
Wenn der Konstruktor aufgerufen wird, existiert das Objekt bereits. Es geht nur noch darum, die Variablen richtig zu initialisieren.

Das kann so aussehen:
Code:
public cass TDrawing extends Drawing{
  public TDrawing(){
    MouseAdapter mouse = new MouseAdapter(){
       .... // mousePressed etc
    };

    addMouseListener( mouse ); // bezieht sich auf "this" (Dieses Objekt)
    addMouseMotionListener( mouse );
  }
}
 
Das hab ich auch gerade verstanden. Nur bleibt das Problem, dass ich in den Listener die Labels verändere, die ich erst in der main anlege.
 
Ok, wenn man das jetzt auch noch kapseln wollte, müsste man noch mehr Klassen machen... (bzw. all die Labels ebenfalls in Variablen speichern), ich glaube der Aufwand das umzuschreiben lohnt sich doch nicht :-/

Behalts einfach im Hinterkopf für das nächste Programm :wink:
 
Hab es mal etwas umgeschrieben und versucht übersichtlicher zu gestalten. http://pastebin.com/517240

Naja, funktionieren tut es natürlich nicht. Man abgesehen davon, dass mir Eclipse immernoch nen Fenster rausschmeißt dessen BG blau ist, obwohl ich nicht wüßte, dass irgendwo so geschrieben zu haben.

*geht weiter auf Fehlersuche*

Greetz Sanne
 
Bin doch gar net so blond, wie ich aussehe. Weiß auch nicht warum Eclipse immer ne alte Version der Klasse gezeigt hat. Jedenfalls funktioniert es jetz!

Vielen lieben Dank!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben