Zeichnen auf zwei Labels. Geht nit

Status
Nicht offen für weitere Antworten.

andy_y

Mitglied
Hi. Ich hab ein Applet mit 2 Labels. Beide werden jeweils durch ne eigene Klasse, die von Label abgeleitet ist, repräsentiert und besitzen jedes eine Methode, in der ich Rechtecke usw. zeichne.

Die Instanzen der beiden Klassen sind L1 und L2. L1 hat ne Hintergrundfarbe, L2 ist durchsichtig.

In der Klasse, die von Applet abgeleitet ist, habe ich einen MouseListener implementiert. Zum zeichnen eines Rechtecks (für den Anfang reicht das) brauche ich in den beiden Label-Klassen das Graphic-Objekt des jeweiligen Labels, sowie die Koordinaten des Punktes, an dem ich die Maustaste drücke und die des Punktes, an dem ich sie loslasse.

In mouseReleased(MouseEvent MEvt) rufe ich dann die Methode 'Zeichnen', in z.B.: der Klasse von Label1, auf und übergebe die 5 Argumente.

Das funktioniert auch alles ganz gut sowiet und ich bekomme auch keine Fehlermeldung, weder beim compilieren, noch beim ausführen des Applets.

Das Problem ist: es wird nicht gezeichnet.

Hier ist mal der ungefähre Code:

Code:
public class Hauptklasse extends Applet implements MouseListener {

 public int X1, Y1, X2, Y2;
 public Graphic graphicL1, graphicL2;

 public void init() {
  //Komponenten setzen usw.
  KlasseL1 L1 = new KlasseL1();
  KlasseL2 L2 = new KlasseL2();
 }

 public void mousePressed(MouseEvent MEvt) {
  X1 = MEvt.getX();
  Y1 = MEvt.getY();
  graphicL1 = L1.getGraphics();
  graphicL2 = L2.getGraphics();
 }

 public void mouseReleased(MouseEvent MEvt) {
  X2 = MEvt.getX();
  Y2 = MEvt.getY();
  L1.Zeichnen(graphicL1, X1, Y1, X2, Y2);
 }
}

class KlasseL1 {
 
 public void Zeichnen(Graphic graphic, int X1, int Y1, int X2, int Y2) {
  graphic.drawRect(X1,Y1,X2-X1,Y2-Y1);
 }
}

class KlasseL2 {
 
 public void Zeichnen(Graphic graphic, int X1, int Y1, int X2, int Y2) {
  graphic.drawRect(X1,Y1,X2-X1,Y2-Y1);
 }
}

Ich glaub so ungefähr war der Code. Ich komm jetzt bloss nich an den richtigen Code ran, weil ich nich zu Hause bin.
Hoffe mir kann jemand helfen bei dem gewurschel.
 
Das "Graphics"-Objekt kann man nicht speichern, es "zerfällt" nach einer gewissen Zeit.
- Zeichne auf ein BufferedImage, und dieses Image dann auf das Label (besser Panel).
- Oder: speichere deine Rechtecke in einer Liste, und zeichne sie alle aufeinmal.

In jedem Fall musst du "paintComponent" überschreiben, und das Graphics verwenden, das du da bekommst (und repaint() aufrufen, wenn was neues gezeichnet werden soll).
 
Aber wenn ich doch bei jedem Mausklick
Code:
graphicL1 = L1.getGraphic();
aufrufe, dann hab ich doch bei jedem Zeichnen ein neues Graphics-Objekt.
 
L1 ist doch deine eigene Klasse?
da fragt man sich wo L1 das Graphic-Objekt herbekommt, wenn es nicht dort irgendwo gespeichert ist,

das Problem verschiebt sich also nur,
 
Hm, jetzt bin ich doch leicht durcheinander.
Label ist doch von Component abgeleitet. Und Component besitzt die Methode getGraphics().
Also bekomme ich doch den Grafikkontext wenn ich schreibe L1.getGraphics().
Und mit dem zeichne ich.
Oder hab ich jetzt nen Denkfehler ???:L
 
Du musst paintComponent überschreiben weil diese Methode
jedesmal vom System aufgerufen wird wenn ein repaint
erforderlich wird, z.B. wenn dein Frame von einer anderen
Anwendung verdeckt wird und dann wieder aufgedeckt wird.
 
L1 ist also eine Klasse die von Label abgeleittet ist,
gut zu wissen, dass ist ja aus deinem Code nicht ersichtlich,

nun ist zwar die Operation getGraphics() verständlich aber es gilt trotzdem:
diese Operation hat (soweit ich das verstehe) nix mit dem Zeichnen zu tun, höchstens intern,

die Darstellung von Komponenten kann man ändern indem man ihre paint()/ paintComponent()-Operationen überschreibt,
um das Zeichnen auszulösen ruft man repaint() auf,
mehr gibts da gar nicht zu wissen, steht sicherlich auch in einem beliebigen Java-Buch deiner Wahl in dieser Form

dein Code müsste grob also eher wie folgt aufgebaut sein:
Code:
public class Hauptklasse extends Applet implements MouseListener {

public int X1, Y1, X2, Y2;
public Graphic graphicL1, graphicL2;

public void init() {
  //Komponenten setzen usw.
  KlasseL1 L1 = new KlasseL1();
  KlasseL2 L2 = new KlasseL2();
}

public void mousePressed(MouseEvent MEvt) {
  X1 = MEvt.getX();
  Y1 = MEvt.getY();
}

public void mouseReleased(MouseEvent MEvt) {
  X2 = MEvt.getX();
  Y2 = MEvt.getY();
  L1.setData(x1,y1,x2,y2)
  L1.repaint();
}
}

class KlasseL1 {

public int X1, Y1, X2, Y2;

public void setData(int newX1, ...) {
   this.x1 = newX1;
   ...
}

public void paint(Graphic graphic) {
  graphic.drawRect(X1,Y1,X2-X1,Y2-Y1);
}

}

}

erscheint vielleicht umständlich im Moment,
mit mehr Beispielen/ Übung wirds irgendwann klarer
 
SlaterB hat gesagt.:
L1 ist doch deine eigene Klasse?
SlaterB hat gesagt.:
L1 ist also eine Klasse die von Label abgeleittet ist,
gut zu wissen, dass ist ja aus deinem Code nicht ersichtlich?

Hihi, solche Verwirrung kann entstehen wenn sich einer nicht an die Konventionen
hält. 😎

Code:
KlasseL1 L1 = new KlasseL1();

L1 sind im Originalcode keine Klassen sondern Variablen die andy_y nur nicht
klein geschrieben hat.

Außerdem sehe ich gerade, daß sie keine Instanzvariablen sind, sondern nur
lokal in der init()-Methode erzeugt und gleich wieder verworfen werden.

Außerdem werden die Klassen KlasseL1 und KlasseL2 gar nicht von Label
abgeleitet. Ich schätze andy_y sollte sich erstmal mithilfe eines Tutorials
etwas intensiver in AWT-Programmierung einarbeiten :###
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben