Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Rechtecke zeichnen ohne drawRect

Empfohlene Antworten

Veröffentlicht

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.

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

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

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

na dann ...

Aber wo steht das? Is das was AWT-spezifisches?

Bearbeitet von tha_specializt

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.