FS_Sebi Geschrieben 28. August 2008 Geschrieben 28. August 2008 Hi, ich wollte ein Applet schreiben, dass ähnlich wie in Paint ein Rechteck zeichnet. Wenn die Maustaste gedrückt wird, wird die linke obere Ecke festgelegt. Bei angehaltener Maustaste legt man dann die untere rechte Ecke fest, wobei man ständig die Größe des Rechtecks sieht. Beim loslassen wird das Rechteck dann festgelegt. Das ganze soll ohne drawRect funktionieren. Ich krieg das ganze leider nicht so hin wie es sein sollte. Ich poste hier mal das Grundgerüst, zum Linien zeichnen, auf dem das ganze aufbauen soll: package Übungen; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.*; public class D2_Swing_Image extends JApplet implements MouseMotionListener { BufferedImage bi; Graphics2D big2; int x, y; boolean reset = true; public void init() { bi = (BufferedImage)createImage(getWidth(), getHeight()); big2 = bi.createGraphics(); big2.setStroke(new BasicStroke(4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)); big2.setPaint(Color.RED); addMouseMotionListener(this); } public void paint(Graphics g){ Graphics2D g2=(Graphics2D)g; g2.drawImage(bi, null, 0 , 0); } public void mouseDragged(MouseEvent ev) { if(reset){ reset = false; x = ev.getX() - 1; y = ev.getY(); } big2.draw(new Line2D.Double(x, y, ev.getX(), ev.getY())); x = ev.getX(); y = ev.getY(); repaint(); } public void mouseMoved(MouseEvent ev) { reset = true; } } Vielen Dank. Zitieren
speedi Geschrieben 28. August 2008 Geschrieben 28. August 2008 Mal so ne Frage: warum kein drawRect? Prinzipielle Lösung des Problems: Du solltest dir in deinem Image einfach nur das speichern was schon definitiv gezeichnet wurde. Du benögst erstmal einen MouseListener bei dem du in der mousePressed die aktuelle Mausposition als Startposition deines Rechecks speicherst. Dann benötigst du einen MouseMotionListener der dir in der mouseDragged die aktuelle endposition deines Rechtecks speichert und die repaint runft. In der paint zeichnest du dann zuerst das Image mit allen was sicher gezeichnet wurde und zum 2. ein Rechteck zwischen den 2 Punkten die du dir gespeichert hast (frage vorher aber ab, ob beide Punkte != null sind! Die beiden Punkte könntest du z.B. als Klassenvariablen speichern). Nun musst du deinen MousListener nur noch ein bisschen Funktionalität in die mouseReleased schreiben, welche das Rechteckt zwischen den 2 Punkten endgültig in dein Image schreibt. Zitieren
tha_specializt Geschrieben 5. September 2008 Geschrieben 5. September 2008 (bearbeitet) der code da oben verursacht zweifellos grosse CPU-Lasten, im Nicht-Gaming-Bereich is das n einziger Programmierfehler. Thread.currentThread.sleep(100) wirkt bereits Wunder, evtl. sind 40ms auch noch vertretbar, aber allzu kurz würde ich nicht schlafen .... noch besser: eigene Queue bauen (wenns sein muss auch die von Java gegebenen nutzen) und alles (ganz besonders die grafischen Dinge) schön einreihen, so bist du auch threadsafe und trotzdem einigermassen performant ohne 100% CPU-Last zu verursachen. Bearbeitet 5. September 2008 von tha_specializt Zitieren
speedi Geschrieben 5. September 2008 Geschrieben 5. September 2008 (bearbeitet) der code da oben verursacht zweifellos grosse CPU-Lasten, im Nicht-Gaming-Bereich is das n einziger Programmierfehler. Das glaube ich weniger, denn das Event wird nur alle 50 ms ausgelöst. ____________________________________________________________ Sry... habs grad überprüft. hast recht. Wird alle 0-15 ms gerufen. Thread.sleep würde also Sinn machen. Jedoch finde ich 100 schon ziemlich heftig. 30 dürfte auch noch schnell genug sein und ist von sehen her ziemlich flüssig. Bearbeitet 5. September 2008 von speedi Zitieren
tha_specializt Geschrieben 5. September 2008 Geschrieben 5. September 2008 (bearbeitet) na dann ... Aber wo steht das? Is das was AWT-spezifisches? Bearbeitet 5. September 2008 von tha_specializt Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.