Veröffentlicht 28. August 200817 j 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.
28. August 200817 j 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.
5. September 200817 j 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 200817 j von tha_specializt
5. September 200817 j 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 200817 j von speedi
5. September 200817 j na dann ... Aber wo steht das? Is das was AWT-spezifisches? Bearbeitet 5. September 200817 j von tha_specializt
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.