gemaltes wieder löschen

Status
Nicht offen für weitere Antworten.

anfänger15

Bekanntes Mitglied
Hallo

Bei meinem Programm soll man das was man gemalt hat auch wieder löschen können da hab ich aber nur die methode clearRect() zum löschen von Rechtecken gefunden. Gibts da auch noch andere methoden zum löschen oder wie muss man das machen?

Habe es schon Versucht z.B ein neues Rechteck in der Hintergrundfarbe zu malen um etwas anderes so zusagen zu löschen. Das geht gut nur wenn ich etwas das ich mit fill gezeichnet habe löschen will geht es nicht

Habt ihr ideeen?
 

nocxsville

Bekanntes Mitglied
Ich hab mich mit diesem Thema noch nicht wirklich beschäftigt, aber ich würde alle gemalten Objekte in einer Collection speichern. Wenn ein Objekt gelöscht werden soll dann wird es aus der Collection entfernt. Danach alle müssen Objekte neuzeichenen lassen. Geht aber bestimmt auch noch performanter.

Gruß,
nocxsville.
 

Marco13

Top Contributor
Naja - bei dem clearRect steht so ein Kommentar dabei
http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Graphics.html#clearRect(int,%20int,%20int,%20int)
und die Aussage "das geht nicht" ist auch ein bißchen dünn. Aber eigentlich müßte es doch ein
g.setColor(Color.WHITE); // oder so
g.fillRect(x,y,w,h);
tun!?
 

anfänger15

Bekanntes Mitglied
ok hab das mal versucht ich hoffe es war so gemeint:
Code:
Graphics2D t = (Graphics2D) g; 
t.setBackground(Color.white);            
g.clearRect(x, y, 5, 5);

Damit kann man aber nur Rechtecke löschen.Linien gehen nicht ich denke das funktioniert mit clearRect nicht da man mit dem doch nur Rechtecke löschen kann, oder?
 

Marco13

Top Contributor
Alles was du gemalt hast, kannst du wieder löschen indem du es nochmal zeichnest - mit der Hintergrundfarbe. Aber inzwischen klingt diese Problembeschreibung (die sich iterativ (aber vermutlich nur asymptotisch) dem annähert, was du gleich im ersten Post hättest schreiben können) so, als wäre nocxsville's Vorschlag der richtige Hinweis...
 

anfänger15

Bekanntes Mitglied
Marco13 ich hab zwar die hälfte was du mir sagen wolltest (z.B. die sich iterativ (aber vermutlich nur asymptotisch) dem annähert) nicht verstanden, aber egal.Ich wollte ja nur wissen wie man ein "Radiergummi" so wie bei paint programmiert. Falls mir da jemand helfen kann wäre ich sehr froh darüber.
 

anfänger15

Bekanntes Mitglied
so zeichne ich in das JPanel:
Code:
 	g.setColor(getForeground());
	for (int i=0; i < re; i++) {
	    Rectangle p = (Rectangle)rechteck.elementAt(i);
	    g.setColor((Color)Rcolor.elementAt(i));
		g.drawRect(p.x, p.y, p.width, p.height);

                }
	if (mode == RECHTECK) {
	    g.setColor(getForeground());
	    if (x2 != -1) {
                g.drawRect(x, y, w, h);
                	
                }
	    }

kann mir jemand helfen?
danke
 

Marco13

Top Contributor
Die Ausführungen mit dem "iterativ/asymptotisch" bezogen sich darauf, dass du dir vielleicht mal überlegen solltest, ob DU, wenn du die Antwort denn mal irgendwann gefunden hast, und dir die Frage, die du zuerst gestellt hast, nochmal durchliest, SELBST noch verstehen wirst, was du mit der Frage überhaupt gemeint hast, und in welchem Zusammenhang(!) du sie gestellt hast.

(Kurz: Drück dich klarer aus :wink: )

Wenn du so löschen willst, wie mit dem Radiergummi bei paint, dann solltest du das, was du malst, in ein BufferedImage malen (und in der paintComponent-Methode dann nurnoch dieses BufferedImage malen). Um in diesem BufferedImage etwas zu löschen, kannst du einfach an der Mausposition Pixel mit der gewünschten Farbe setzen (z.B. mit der Hintergrundfarbe). Wenn du nicht einzelne Pixel sondern größere Bereiche löschen willst, kannst du auch an der Mausposition in dem BufferedImage ein fillOval mit der gewünschten Farbe machen.

Pseudocode
Code:
BufferedImage bufferedImage = ...
Graphics imageGraphics = bufferedImage.getGraphcis();

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.drawImage(bufferedImage, 0, 0, this);
}

public void mouseDragged(MouseEvent e)
{
    ... // if (radier-Modus ist an)
        imageGraphics.setColor(Color.WHITE); // Hintergrundfarbe
        imageGraphics.fillOval(e.getX(), e.getY(), 2, 2); // Bereich löschen
}
 

anfänger15

Bekanntes Mitglied
der Code

Code:
 public void draw(Graphics image){
 img = new BufferedImage(bildanzeige.getSize().width,bildanzeige.getSize().height, BufferedImage.TYPE_INT_RGB);

 image = img.getGraphics();
 	image.drawRect(0,0,100,100);
}

so zeichnet es ein Rechteck, wenn ich aber den Zeichenmous in draw festlegen will kommt es zu einem java.lang.OutOfMemory

Was mache ich falsch?
 

anfänger15

Bekanntes Mitglied
das muss irgendwas mit dem hier zu tun haben
Code:
  if (Label.equals("Oval")) 
  	bildanzeige.setDrawMode(CBildLeinwand.OVAL);
Wenn ich das weg lass und den Text des Buttons mit dem Label vergleiche und dann zeichne geht es. Dann funktioniert aber der Rectangle nicht und wenn ich was neues zeichne ist das alte wieder weg.Wenn ich es so mache kommt es zu einem java.lang.OutOfMemory fehler

Weis jemand rat?
 

anfänger15

Bekanntes Mitglied
ok hab es gesschaft ich zeichne jetzt alles in ein Image und dann zeichne ich das image auf den JPanel allerdings hat sich beim löschen überhaubt nichts geändert.ES GEHT IMMER NOCH NICHT. Ich hab es genau so gemacht wie Marco13 es geschrieben hat aber jeden Punkt, den ich gelöscht habe wird durch die Rectangle wieder gezeichnet und ohne die Rectangle geht es nicht da dann das gemalte beim nächsten malen wieder weg ist.

Hat jemand eine idee wie ich das machen kann?
 

Marco13

Top Contributor
Linke Maustaste: Malen
Rechte Maustaste: Gemaltes wieder löschen.

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;

class PaintPanel extends JPanel implements MouseMotionListener
{
    private BufferedImage image;
    private Graphics imageGraphics;

    public PaintPanel()
    {
        addMouseMotionListener(this);
    }

    public void paintComponent(Graphics g)
    {
        if (image == null)
        {
            image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
            imageGraphics = image.getGraphics();
        }
        g.drawImage(image, 0, 0, this);
    }

    public void mouseMoved(MouseEvent e) {}

    public void mouseDragged(MouseEvent e)
    {
        int onmask = InputEvent.BUTTON1_DOWN_MASK;
        if ((e.getModifiersEx() & onmask) == onmask)
        {
            imageGraphics.setColor(Color.RED);
        }
        else
        {
            imageGraphics.setColor(Color.BLACK);
        }
        imageGraphics.fillOval(e.getX()-6, e.getY()-6, 12,12);
        repaint();
    }
}

class PaintTest extends JFrame
{
    public static void main(String args[])
    {
        new PaintTest();
    }

    public PaintTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300,300);
        PaintPanel paintPanel = new PaintPanel();

        getContentPane().setLayout(new GridLayout(1,1));
        getContentPane().add(paintPanel);
        setVisible(true);
    }
}

Bei dir geht das aber vermutlich nicht, weil das ja bei dir alles ganz anders ist.
 

anfänger15

Bekanntes Mitglied
Die Idee hatte ich auch schon. Wenn man da aber dann ein einziges,nicht gefülltest Rechteck(wie in Paint) zeichnen will zeichnet es viele Rechtecke, was ja gar nicht gemacht werden soll.
 

Marco13

Top Contributor
Dafür würdest du dann folgendermaßen vorgehen:

In der Klasse liegt eine Variable "currentlyPaintedRectangle" (oder so). Wenn der benutzer gerade dabei ist, ein Rechteck zu malen (aber noch nicht fertig ist), dann speichert currentlyPaintedRectangle dieses Rechteck, andernfalls ist es null.

Wenn die Maus gedrückt wird (mousePressed) wird ein "currentlyPaintedRectangle" erstellt. Die Linke obere Ecke ist die Mausposition. Dieses currentlyPaintedRectangle wird erstmal NUR in der paintComponent-Methode gemalt (nachdem das bufferedImage gemalt wurde).

Wenn der Benutzer die Maus draggt, wird die rechte untere Ecke des Rechtecks verschoben, und immer repaint() aufgerufen. In der paintComponent malt er dann das bisherige Bild, und zusätzlich das Rechteck, das der Benutzer gerade erstellt.

Sobald der Benutzer die Maus losläßt (mouseReleased) wird es interessant: Dann ist das Rechteck "fertig", und kann in das Bild übertragen werden. Dann malt man EINMAL (!) das fertige(!) currentlyPaintedRectangle in das bufferedImageGraphics-Objekt. Anschließend setzt man currentlyPaintedRectangle auf null, und ruft repaint() auf. Er malt dann nurnoch das fertige Bild, das nun auch das neue Rechteck enthält.
 

anfänger15

Bekanntes Mitglied
ah danke hilft mir bestimmt weiter kann es nur die nächste Zeit leider nicht testen, da uns unsere Lehrer gleich am ersten Tag nach den ferien 5 neue Arbeiten(KA) aufgebrummt haben.
 

Marco13

Top Contributor
Es hieß nicht "currentlyPaintedImage", sondern
"currentlyPaintedRectangle" (oder so)
Das sollte andeuten, dass du "irgendwo" eine solche Variable anlegen solltest. (Bei dem Code, den ich gepostet hatte, würde die in "PaintPanel" liegen). Die kann natürlich auch anders heißen. Es ging nur daraum, dass sie das Objekt speichert, das gerade gemalt wird, aber noch NICHT in das BufferedImage übertragen wurde.
 
H

HaBaLeS

Gast
Also wenn du wirklich den Radiergummi wollst, solltest du dir folgendes anschauen:

java.sun.com/docs/books/tutorial/2d/advanced/compositing.html

Du kannst mit Composite verschiedene Stiftypen einstellen. Einer davon ist löschen.
Code:
g.setComposite(AlphaComposite.Clear);

alles was du jetzt malst wirkt wie radieren. Falls das Bild Transparent ist wird bis zur Transparenz wegradiert. Hast du keine Transparenz, wird bis zur Hintergrundfarbe radiert.
Nicht vergessen wieder auf den "normalen" Modus zu wechseln.

Code:
g.setComposite(AlphaComposite.SrcOver);


Diese Methode eignet sich auch sehr gut, um komplett transparente Bilder aus Java heraus zu erzeugen.

Grüße
Falko
 

Marco13

Top Contributor
Das geht imho schon einen Schritt weiter: Damit könnte man erreichen, dass beim Radieren nicht vollkommen gelöscht wird, sondern dass der adiergummi "weich" ist - ich vermute, zusammen mit einem GradientPaint könnte man da schon richtig Professionell aussehende Radierungen hinkriegen :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Oneixee5 Oracle, wieder mal ... Allgemeine Java-Themen 12
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
V Scheinbar zufällig hin und wieder: Can't create an ImageOutputStream! Allgemeine Java-Themen 8
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
F JLabel nach 5 Sekunden wieder leeren Allgemeine Java-Themen 7
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4
S Zahlen aus (String mit zahlen) immer wieder neu auslesen Allgemeine Java-Themen 5
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
M CapsLock abfragen wenn Fenster wieder aktiviert wird Allgemeine Java-Themen 5
B Mal wieder "Could not find the main class" Allgemeine Java-Themen 3
C Datentypen int in bytes zerlegen und wieder zusammen setzen Allgemeine Java-Themen 13
S Strings gehen "kaputt" wenn ich in CVS ein und wieder auschecke. Allgemeine Java-Themen 2
F Wieder mal die eBay API Allgemeine Java-Themen 3
E Speicherverwaltung bzw. Speicher wieder frei geben?! Allgemeine Java-Themen 8
T JConsole: Klassen werden geladen aber nicht wieder entladen Allgemeine Java-Themen 3
S Thread vorübergehend stilllegen und wieder aufwecken Allgemeine Java-Themen 18
data89 A-Stern: fährt immer wieder vor die Wand! - Hilfeeee Allgemeine Java-Themen 7
L Thread kurz unterbrechen und wieder starten Allgemeine Java-Themen 5
L Applet immer wieder neu laden - Problem Allgemeine Java-Themen 25
T RegEx, wieder einmal ... :-( Allgemeine Java-Themen 19
S Wieso stehen in der API immer wieder abstrakte Methoden ? Allgemeine Java-Themen 7
C Aus XML ein DOM Objekt und wieder zurück Allgemeine Java-Themen 2
M wieder mal applet probleme Allgemeine Java-Themen 17
A HTML-Seite wieder schließen Allgemeine Java-Themen 2
W Wieder einmal: PNG ausdrucken Allgemeine Java-Themen 3
S GUI komplett schließen und wieder Neu laden? Allgemeine Java-Themen 4
C Bild in .txt speichern und wieder als Bild speichern Allgemeine Java-Themen 2
Y Mal wieder vergleichen von Strings.[Leider noch ein Problem] Allgemeine Java-Themen 18
A String in umgekehrter reihenfolgen wieder geben Allgemeine Java-Themen 16
GilbertGrape mal wieder ne Regex-Frage Allgemeine Java-Themen 2
A Javakonsolenfenster geht gleich wieder zu Allgemeine Java-Themen 6
G Schon wieder Regex Problem :-/ Allgemeine Java-Themen 6
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
L Werte in externer Datei speichern und wieder auslesen? Allgemeine Java-Themen 8
M Programm schließen und wieder neu starten Allgemeine Java-Themen 9
E Wieder mal der Classloader Allgemeine Java-Themen 6
J Nicht schießen - schon wieder OpenOffice. Allgemeine Java-Themen 4
R Immer wieder NullPointerException Allgemeine Java-Themen 2
L JVM: Speicher wieder für OS freigeben? Allgemeine Java-Themen 5
I Aus Exception wieder zurück Allgemeine Java-Themen 5
J Thread beenden und wieder starten? Allgemeine Java-Themen 20
M Array in eine Datei Schreiben und wieder auslesen Allgemeine Java-Themen 10
S Job immer wieder ausführen Allgemeine Java-Themen 4
N Mal wieder char-encoding Probleme Allgemeine Java-Themen 5
P Filechooser öffnet sich immer wieder neu Allgemeine Java-Themen 4
L Speicherplatz eies RIESEN objektes direkt wieder freigeben Allgemeine Java-Themen 5
V Irgendwie benutzt er wieder Java 1.4 Allgemeine Java-Themen 7
G Array/String aus Request wieder in Array konvertieren Allgemeine Java-Themen 2
U Mal wieder DoubleBuffering Allgemeine Java-Themen 20
A Thema JAR-Erstellung (mal wieder) => etwas komplizierter Allgemeine Java-Themen 8
L schon wieder der "javac nicht gefunden" fehler Allgemeine Java-Themen 9
T Objekte eindeutig zerlegen und wieder zusammen bauen? Allgemeine Java-Themen 6
B mal wieder jar! Allgemeine Java-Themen 53
M schon wieder Comport-Problem Allgemeine Java-Themen 21
S JPanel zur Laufzeit verbergen bzw. wieder anzeigen lassen Allgemeine Java-Themen 4
C Über C/C++ (JNI) angeforderten Speicher wieder frei geben Allgemeine Java-Themen 3
M statische regex und vergleiche oder immer wieder compilen Allgemeine Java-Themen 2
R Aus InputStream wieder eine Datei erzeugen? Allgemeine Java-Themen 2
U schon wieder regex Allgemeine Java-Themen 3
M Mal wieder . Regular Expressions Allgemeine Java-Themen 2
J Mal wieder jars Allgemeine Java-Themen 2
T CMD nach aufruf von javaw Programmname wieder schließen Allgemeine Java-Themen 3
J String mit GZIPInputStream in Datei schreiben und wieder les Allgemeine Java-Themen 2
J User Klasse in den Vector, Object Klasse wieder raus... Allgemeine Java-Themen 4
D Bilder einlesen, bearbeiten und wieder in Datei schreiben Allgemeine Java-Themen 3
G Adressen in Datei speichern und wieder auslesen Allgemeine Java-Themen 3
M löschen in Rot Schwarz Bäumen Allgemeine Java-Themen 6
M lineare Sondierung löschen Allgemeine Java-Themen 2
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
E Varialbe komplett Löschen Allgemeine Java-Themen 26
O Warum kann ich so keine Elemente löschen und erhalte einen IllegalStateException? Allgemeine Java-Themen 4
J ArrayList, ganze Zeilen löschen oder überspringen Allgemeine Java-Themen 4
glamdring273 Discord JDA, Kanal löschen Allgemeine Java-Themen 0
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
S Einzigartigen String in Datenbank finden und löschen Allgemeine Java-Themen 23
J Datei löschen, die Leerzeichen im Pfad hat Allgemeine Java-Themen 5
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
A Referenzen von Bildobjekten löschen Allgemeine Java-Themen 0
I PDF freigeben zum löschen Allgemeine Java-Themen 4
P Löschen eines keys in einer SortedMap Allgemeine Java-Themen 5
P JDK installieren Kann man die Ordner in C:\Users\*\AppData\LocalLow\Sun\Java\.... löschen? Allgemeine Java-Themen 3
X Löschen von einer Zeile in einer Text Datei. Klappt nicht. Allgemeine Java-Themen 4
J Java - Zeile aus Text datei löschen Allgemeine Java-Themen 13
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
G Datei löschen Allgemeine Java-Themen 8
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
Bluedaishi Dateien löschen die älter als das aktuelle Datum sind Allgemeine Java-Themen 9
L Doppelte eintraege im Stringbuffer löschen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben