Zum Inhalt springen

Rechtecke zeichnen ohne drawRect


Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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.

  • 2 Wochen später...
Geschrieben (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 von tha_specializt
Geschrieben (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 von speedi

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...