DJViking Skrevet 26. november 2002 Del Skrevet 26. november 2002 Jeg har et lite problem med et tegnebrett jeg holder på å programmere. jeg tegner opp rektangler som kan flyttes rundt på brettet med musen. Jeg får tegnet opp dette og flyttet rundt, men problemet er at med en gang rektanglet er tegnet opp forsvinner det bak panelet. Hvis jeg trykker på området hvor rektanglet ligger så kommer det dels til syne og jeg kan flyttet det, men når jeg slipper det igjen forsvinner det i bakgrunnen. Jeg kaller repaint til panelet som i sin tur kaller draw for rektangel klassen Prøvde å begrense kodeutlegging,men det som er nedenfor er nødvendig for å forstå hva problemet kan være. Jeg hadde satt pris om noen kunne hjelpe meg. // tegner rektanglet public void tegnKlasse(){ unpick(); klasse_teller++; Integer i = new Integer(klasse_teller); String objnavn = "Klasse" + i.toString(); kl = new Klasse(objnavn, XPOS, YPOS, tegnepanel); klasser.add(kl); kl.draw(); bpanel.klasseKnappOff(); } // tegner rektanglet ved å klikke med musen på panelet public void mouseReleased(MouseEvent e){ if(klasseIsPressed){ klasseIsPressed = false; XPOS = e.getX(); YPOS = e.getY(); tegnKlasse(); } } // tegner objektet på nytt ved panel.repaint public void reDraw(){ for (int i = 0; i < klasser.size(); i++) { Klasse v = (Klasse)klasser.get(i); v.draw(); } } // kaller move som kaller panel.repaint public void mouseDragged(MouseEvent e){ if(isSelected){ XPOS = e.getX(); YPOS = e.getY(); valgtKlasse.move(XPOS,YPOS); } } public void mouseClicked(MouseEvent e){ unpick(); tegnepanel.repaint(); for(int i = 0; i < klasser.size(); i++){ Klasse kl = (Klasse)klasser.get(i); if( kl.contains( e.getX(),e.getY() ) ){ valgtKlasse = (Klasse)kl; isSelected = true; kl.setSelected(true); tegnepanel.repaint(); } } } public void paint(Graphics g){ super.paint(g); pm.reDraw(); } Lenke til kommentar
MailMan13 Skrevet 26. november 2002 Del Skrevet 26. november 2002 Hvis du setter koden inni kode her får du med innrykkene også, så går det an å lese koden din :smile: Jeg går utifra at "Klasse" er rektanglene dine ?!?(java.awt har en 'Rectangle' klasse, så du trenger vel ikke å lage denne selv). Sikker på at repaint() blir kalt riktig, så vidt jeg kan se kaller du repaint() når en museknapp trykkes, og det fungerer jo tilsynelatende (i og med at rektangelet tegnes når du klikker på det), men ikke ellers, har du prøvd å kalle repaint i mouseDragged og mouseReleased i stedetfor i move metoden. Synes det skurrer litt at rektanglene selv kaller repaint (lav koherens og mange koblinger), selve tegningen bør skje i panel klassen, mens rektanglene bare inneholder koordinater metoder for flytting. Da hadde det vert lettere andre å se hva som skjer her samtidig som du slipper å lage egen klasse for rektangelet. Edit: glemte å skru av bbcode [ Denne Melding var redigert av: MailMan13 på 2002-11-26 12:29 ] Lenke til kommentar
DJViking Skrevet 26. november 2002 Forfatter Del Skrevet 26. november 2002 Grunnen til at jeg har en klasse som heter Klasse(også Pakke og Grensenitt) er at jeg lager et tegnebrett for UML klassediagram. Klasse klassen holder informasjon om en klasse og dens metoder og attributter og har en draw() for å tegne seg opp på panelet med sine verdier. og en move metode som kaller repaint(). Det eneste "Rectangle" kommer inn i bildet er Code: private Rectangle rect;public void saveAsRect() { rect = new Rectangle(XPOS-bredde/2, YPOS-hoyde/2,bredde, hoyde); } Som jeg kaller når jeg oppretter en ny instans av Klasse og tegner opp det rektanglet. Lenke til kommentar
MailMan13 Skrevet 26. november 2002 Del Skrevet 26. november 2002 Hvis du lager program for uml modellering har du kanskje laget deg et sekvensdiagram for mouseClicked, mouseDragged og mouseReleased også, det kan jo hjelpe deg å se hva som skal skje hvor, og hvilke objekter som tegner hva, men ikke gjør det. Da må jo også rektanglene skrive ut seg selv, så se bort ifra den. Det vil vel være fornuftig å utlede den til en abstrakt klasse hvis du skal kunne skrive ut ulike typer (klasser, pakker og interfaces) på samme måte også. Her er en liten applet som flytter to rektangler rundt på skjermen, så har vi en referanse som virker: Code: import java.awt.*;import java.awt.event.*;import javax.swing.event.*;public class RectApplet extends javax.swing.JApplet implements MouseInputListener { java.util.Vector rects = new Vector(); Rectangle active; Point pos; public void init() { rects.add(new Rectangle(100, 100, 50, 50)); rects.add(new Rectangle(200, 200, 50, 50)); setSize(400, 300); addMouseListener(this); addMouseMotionListener(this); } public void paint(Graphics p) { p.clearRect(0, 0, getSize().width, getSize().height); for(int i=0; i<rects.size();i++) { Rectangle r = (Rectangle)rects.get(i); p.fillRect(r.x, r.y, r.width, r.height); } } public void mousePressed(MouseEvent e) { pos = e.getPoint(); for(int i=0; i<rects.size();i++) { Rectangle r = (Rectangle)rects.get(i); active = r.contains(pos) ? r : active; } } public void mouseDragged(MouseEvent e) { int x = e.getX() - pos.x; int y = e.getY() - pos.y; pos = e.getPoint(); if(active != null) active.setLocation(active.x + x, active.y + y); repaint(); } public void mouseReleased(java.awt.event.MouseEvent mouseEvent){ active = null; }} [ Denne Melding var redigert av: MailMan13 på 2002-11-26 14:00 ] Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå