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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...