das is mein erster Post, deshalb hoffe ich das der hier richtig gelandet ist.
Ich habe ein Problem mit mit der implementierung eines MouseListeners. undzwar soll ich ein "schiebepuzzle" implementieren welches ein Rahmen hat. Wenn man auf diesen Rahmen klickt, soll eine Methode aufgerufen werden, die das Puzzle gelöst darstellen soll. wird wieder auf den rahmen geklickt, so soll eine andere Methode aufgerufen werden die das Puzzle durchmischt. Soweit so schlecht....
die "Rahmenmethode" wird von der paint(Graphics g) methode gerufen und sieht wie folgt aus:
Java:
publicvoidpaint(Graphics g){paintBorder(g);paintField(g);}privatevoidpaintBorder(Graphics g){Insets insets =getInsets();Dimension size =getSize();
size.height -= insets.top + insets.bottom;
size.width -= insets.left + insets.right;
fieldsize =newDimension();
fieldsize.width =(size.width -(2* bordersize))/4;
fieldsize.height =(size.height -(2* bordersize))/4;
g.setColor(Color.black);for(int i =0; i <=1;++i){
g.drawRect(
insets.left + i,
insets.top + i,
size.width -1-2* i,
size.height -2-2* i
);
g.drawRect(
insets.left + bordersize - i,
insets.top + bordersize - i,4* fieldsize.width +2* i,4* fieldsize.height +2* i
);}}
Wenn ich nun ein MouseListener deklariere, muss das ja immer auf ein Object "referenziert" werden...nur wie deklariert man ein Object vom Typ Graphics welches ich an den MouseListener binden kann? Mein Gedankenansatz:
MouseListener sollten wenn schon auf einen Container hinzugefügt werden. Deshalb adde ihm auf dem Toplevel-Container, und rechne dir aus, ob der Mouseclick am Border stattfand.
Nein, mit Container meine ich in erster Linie die Klasse, die von Container erbt. (Wobei es schon ein Component kann.)
Dort wo du die Paint überschrieben hast, addest du einfach dem MouseListener.
dann macht der das für das gesamte frame...aber das soll ja NUR auf den Border gelegt werden...selbst wenn ich aus this.addMouseListener(new MouseAdapter(){ nur addMouseListener(new MouseAdapter(){ mache, findet das event auf dem gesamten Frame statt...
Errechne halt, ob die Position über dem Border stattfindet.
Und mache es besser nicht in der Paint, sonst wird bei jedem neu zeichnen ein neuer hinzugefügt, wodurch er x mal bei einem Event ausgeführt wird.
Ein repaint in der paint halte ich auch nicht für geschickt, ich kenn mich mit den Klassen zwar nicht so aus, denke aber dass das eine Endlosschleife erzeugen könnte wodurch der Heap volläuft.
den border errechnet doch schon die paintBorder(Graphics g) methode. das ist nicht mein problem, das problem ist das ich ums verrecken nicht diesen listener auf diesen border bekomme ???:L
gibt es denn ein object welches ich deklarieren kann und dann auf diese koordinaten legen kann um es mit dem MouseListener zu verknüpfen, oder muss das alles über die paint methoden geschehen?