Graphics2D Objekt mir der Maus erstellen

Markus_667

Aktives Mitglied
Hallo Zusammen hier im Forum, ich habe folgendes Problem und komme einfach nicht weiter.
Daher würde ich gerne mein Problem hier im Forum schildern mit der Hoffnung auf Hilfe:
Ich möchte ein Graphics2D Objekt mit der Maus erstellen, aber irgendwie komme ich an eine Punkt wo ich mit den Objekten nicht mehr klar komme:

Da es ein größeres Programm werden soll habe ich verschiedene Dateien erstellt:
Main_Class: (hier wird das Mouse_Gui Objekt erstellt.
Java:
package Mouse_Click_2;

public class Main_Class {

    public static void main(String[] args) {
        // TODO Automatisch generierter Methodenstub

        Mouse_Gui MG = new Mouse_Gui();
    }

}

Mouse_Gui:
Java:
package Mouse_Click_2;

import javax.swing.JFrame;

public class Mouse_Gui {
    JFrame frame;
//static Rechteck rect = new Rechteck();
    
    Mouse_Gui(){
        System.out.println("Maus GUI Konstruktor");
        frame = new JFrame("Mouse Gui");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 500);
        frame.setVisible(true);
        Rechteck rect = new Rechteck();
        frame.add(rect);
        Mouse_Handler handler = new Mouse_Handler();
        frame.addMouseListener(handler);
        frame.addMouseMotionListener(handler);       
    }
}

Rechteck:
Java:
package Mouse_Click_2;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;

import javax.swing.JPanel;

public class Rechteck extends JPanel {

    int x, y;

    public Rechteck() {
        System.out.println("Rechteck Konstruktor ohne Parameter");
       
        x = 1;
        y = 1;   
    }

    public Rechteck(int x, int y) {
        setPreferredSize(new Dimension(500, 500));
        System.out.println("Rechteck Konstruktor X:"+x+"Y:"+y);
        repaint();
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent( g );
        System.out.println("paintcomponent Methode");
        Graphics2D Gragik_2D = (Graphics2D) g;
        Gragik_2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        Rectangle2D rectangle1 = new Rectangle2D.Double(x, y, 30, 30);
        Gragik_2D.draw(rectangle1);
    }

    public void draw(int x, int y) {
       
        System.out.println("Draw Methode" +x+y);
        this.x = x;
        this.y = y;
        repaint();
        }
       
    }

Mouse_Handler:
Java:
package Mouse_Click_2;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class Mouse_Handler implements MouseListener, MouseMotionListener {
    int x;
    int y;

    @Override
    public void mouseDragged(MouseEvent e) {
        System.out.println("dragged");
    }
    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("moved");
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("clicked");
        x = e.getX() - 20;
        y = e.getY() - 30;
        Rechteck rect2 = new Rechteck(x,y);       
    }
    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("entered");
    }
    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("exited");
    }
    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("pressed");
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("released");
    }
}

Wenn ich die Mouse_Gui static mache habe ich es hinbekommen, dass mein Viereck an der Stelle wo die Maus ist immer neu gezeichnet wird. Nun möchte ich aber dass weitere Vierecke entstehen und das alte bleibt.

Nur stehe ich da irgendwie auf dem Schlauch.
Ich denke mir dass ich im mouseClicked Event ein neues Objekt vom Typ Rechteck erstellen muss.
Das habe ich mit: new Rechteck(x,y); erledigt.
Aber die repaint Merhode wird danach gar nicht angesprungen.
Muss ich noch eine Datenstruktur (evtl. Arraylist<Rechteck>) anlegen wo die entstehenden Rechtecke abgelegt werden ?
Da new Rechteck(x,y); ja ohne Variablenname erstellt wird.
Ich habe auch schon probiert das frame static zu machen und dann im mouseClicked Event mit
Mouse_Gui.frame.add(new Rechteck(x,y));
Eine neues Viereck zu erstellen... aber das war auch eine Sackgasse.

Vielen Dank schon mal an Alle die sich damit beschäftigen.

Ich bin für jeden Hinweis oder Ratschlag dankbar.
 

JCODA

Top Contributor
Muss ich noch eine Datenstruktur (evtl. Arraylist<Rechteck>) anlegen wo die entstehenden Rechtecke abgelegt werden ?


richtig, dort werden die Rechteck-Instanzen abgelegt und in der paintComponent wird über diese Liste iteriert und alle gezeichnet.
static hilft dir für dein Problem nicht, wenn du eine schöne Lösung haben möchtest.

EDIT:
Wobei du in dieser Liste vielleicht einfach die Rectangle2D abspeicherst.
Dein JPanel sollte nur einmal vorhanden sein.
 

Markus_667

Aktives Mitglied
Vielen Dank für die schnelle Antwort.
Jetzt hab ich die Rechtecke in eine ArrayList geschrieben aber es werden immer noch keine Vierecke gezeichnet. Lediglich das erste.
Beim Aufruf des überladenen Konstruktors wird kein paintComponent ausgeführt.

Die Anzahl der Elemente in der ArrayList steigt aber bei jedem Klick.
Irgendwo ist da noch der Wurm drin aber ich sehe den Wald vor.....

Ich poste noch einmal meinen momentanen Quelltext von meinen Änderungen.
Java:
package Mouse_Click_2;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

import javax.swing.JPanel;

public class Rechteck extends JPanel {
    static ArrayList<Rectangle2D> Transitionen;
    int x, y;

    public Rechteck() {
        Transitionen = new ArrayList<Rectangle2D>();
        System.out.println("Rechteck Konstruktor ohne Parameter");
        x = 1;
        y = 1;
        Transitionen.add(new Rectangle2D.Double(x, y, 30, 30));
    }

    public Rechteck(int x, int y) {
        setPreferredSize(new Dimension(500, 500));
        System.out.println("Rechteck Konstruktor X:" + x + "Y:" + y);
        Transitionen.add(new Rectangle2D.Double(x, y, 30, 30));
        repaint();
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("paintcomponent Methode");
        Graphics2D Grafik_2D = (Graphics2D) g;
        Grafik_2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (int size = 0; size < Transitionen.size(); size++) {
            System.out.println(Transitionen.get(size));
            Grafik_2D.draw(Transitionen.get(size));
        }
    }
}
Java:
package Mouse_Click_2;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

public class Mouse_Handler implements MouseListener, MouseMotionListener {
    int x, y;

    @Override
    public void mouseDragged(MouseEvent e) {

        System.out.println("dragged");
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("moved");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("clicked");
        x = e.getX() - 20;
        y = e.getY() - 30;
        new Rechteck(x, y);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("entered");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("exited");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("pressed");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("released");
    }

}
 

Markus_667

Aktives Mitglied
Oh das hatte ich vergessen.
Java:
package Mouse_Click_2;

import javax.swing.JFrame;

public class Mouse_Gui {
    static JFrame frame = new JFrame("Mouse Gui");

    Mouse_Gui() {
        System.out.println("Maus GUI Konstruktor");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 500);
        frame.setVisible(true);
        Rechteck rect = new Rechteck();
        frame.add(rect);
        Mouse_Handler handler = new Mouse_Handler();
        frame.addMouseListener(handler);
        frame.addMouseMotionListener(handler);
    }
}
 

JCODA

Top Contributor
Vielleicht so:
Java:
package Mouse_Click_2;

import javax.swing.JFrame;

public class Mouse_Gui {

    public static void main(String args[]){
        JFrame frame = new JFrame("Mouse Gui");
        System.out.println("Maus GUI Konstruktor");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 500);
        frame.setVisible(true);
        DrawingArea drawingArea = new DrawingArea();
        frame.add(drawingArea);
        Mouse_Handler handler = new Mouse_Handler(drawingArea);
        frame.addMouseListener(handler);
        frame.addMouseMotionListener(handler);
    }
  
}

Java:
package Mouse_Click_2;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

import javax.swing.JPanel;

public class DrawingArea extends JPanel {
    private ArrayList<Rectangle2D> rects = new ArrayList<Rectangle2D>();

    public DrawingArea() {
        setPreferredSize(new Dimension(500, 500));
        System.out.println("Rechteck Konstruktor ohne Parameter");       
    }

    public void addRectangle(int x, int y) {       
        System.out.println("addRectangle with X:" + x + "Y:" + y);
        rects.add(new Rectangle2D.Double(x, y, 30, 30));
        repaint();
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("paintcomponent Methode");
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (int i = 0; i < rects.size(); i++) {
            System.out.println(rects.get(i));
            g2d.draw(rects.get(i));
        }
    }
}

Code:
package Mouse_Click_2;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

public class Mouse_Handler implements MouseListener, MouseMotionListener {
   
    private DrawingArea drawingArea;
   
    public Mouse_Handler(DrawingArea drawingArea) {
        this.drawingArea = drawingArea;
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        System.out.println("dragged");
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("moved");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("clicked");
        int x = e.getX() - 20;
        int y = e.getY() - 30;
        drawingArea.addRectangle(x, y);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("entered");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("exited");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("pressed");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("released");
    }

}

So als Tipps, was du dir noch anschauen solltest:

- Parameterübergabe von Objekten. (Hier: Die DrawingArea wird übergeben, sodass addRectangle aufgerufen werden kann.)
- Naming Conventions: Attributnamen schreibt man klein. (Andere werden deinen Code lesen, warum es also denen schwer machen?)
 

Markus_667

Aktives Mitglied
Oha .... ja das klappt deutlich besser als meine Methode. Warum ich das auch in den Konstruktor gelegt hab..?
Bin auch gar nicht drauf gekommen die DrawingArea zu übergeben.
Super vielen lieben dank. Jetzt ist mein Samstag gerettet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
Mr. Pink Graphics2D in anderer Methode aufrufen Java Basics - Anfänger-Themen 6
P Graphics2D Uhr refreshen Java Basics - Anfänger-Themen 2
B Erste Schritte Drehen in Graphics2d Java Basics - Anfänger-Themen 2
T Threads Thread & Graphics2D Java Basics - Anfänger-Themen 8
C Graphics2D - DrawRect - Warum Linien teilweise gefüllt? Java Basics - Anfänger-Themen 12
D Graphics2D (Welle darstellen) Java Basics - Anfänger-Themen 2
F Graphics2D nützlich für R³? Java Basics - Anfänger-Themen 11
C Graphics2D auf anderes Graphics2D übertragen Java Basics - Anfänger-Themen 5
K Graphics2D und BufferedImage Java Basics - Anfänger-Themen 3
P Graphics2D.drawString: Zahlen rechtsbündig ausrichten? Java Basics - Anfänger-Themen 2
Z Farbwechsel JButton mit Graphics2D Java Basics - Anfänger-Themen 7
T Anfänge mit Graphics2D Java Basics - Anfänger-Themen 15
X Kreize zeichnen in Graphics2D Java Basics - Anfänger-Themen 2
D Graphics2D.drawImage(Image, int, int, ?); Java Basics - Anfänger-Themen 2
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
Rxiiz Objekt aus ComboBox entfernen Java Basics - Anfänger-Themen 4
I JSON in Objekt umwandeln Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
Say Objekt Java Basics - Anfänger-Themen 4
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
K warum kann ich das Objekt nicht erstellen ? Java Basics - Anfänger-Themen 2
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
M BlueJ Objekt in Objektliste Java Basics - Anfänger-Themen 2
B Objekt in Klassendiagramm an fremdes Objekt weiterreichen? Java Basics - Anfänger-Themen 6
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
amelie123456 Objekt Farbe Quellcode Java Basics - Anfänger-Themen 4
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
missy72 Klassen Objekt Array NullPointerException Java Basics - Anfänger-Themen 3
J Hinzufügen eines Objektes in ein Objekt-Array Java Basics - Anfänger-Themen 62
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
melaniemueller Fernseher als Objekt Java Basics - Anfänger-Themen 9
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
Nina Pohl Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist Java Basics - Anfänger-Themen 6
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
S Aufzurufendes Objekt Java Basics - Anfänger-Themen 3
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
J Objekt-Array dynamischer Länge aus Benutzereingaben erstellen Java Basics - Anfänger-Themen 6
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
C Arrays - deklarieren, initialisieren? Ist das ein Objekt? Java Basics - Anfänger-Themen 3
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Objekt von EJB in Controller (CDI) - Klasse füllen? Java Basics - Anfänger-Themen 3
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
N LocalTime einem Objekt zuweisen Java Basics - Anfänger-Themen 2
N Länge eines Arrays in einem Objekt testen Java Basics - Anfänger-Themen 51
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
M ArrayList - Objekt kopieren und ändern Java Basics - Anfänger-Themen 11
L Objekt an Methode übergeben Java Basics - Anfänger-Themen 4
S Spiel-Programmieren. Wenn ein Objekt den anderen berührt. Java Basics - Anfänger-Themen 6
J Y-Koordinate von GUI-Objekt bestimmen Java Basics - Anfänger-Themen 2
M Auf erstelltes Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 5
H Referenz Objekt aufrufen Java Basics - Anfänger-Themen 12
M Objekt mit eindeutiger ID löschen, das nächste Objekt hat dann diese ID Java Basics - Anfänger-Themen 5
N Mit Objekt der Superklasse auf Methode der Subklasse zugreifen Java Basics - Anfänger-Themen 6
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
J Objekt bei Auswahl in jList ändern Java Basics - Anfänger-Themen 6
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
H Objekt aus einem Array löschen Java Basics - Anfänger-Themen 1
H Objekt im Array speichern Java Basics - Anfänger-Themen 2
H Objekt mit Methode erstellen Java Basics - Anfänger-Themen 6
H Objekt als Attribut speichern Java Basics - Anfänger-Themen 11
E Was kommt in ein Objekt und was in die Main Methode? Java Basics - Anfänger-Themen 8
R Objekt in Konstruktor ist nicht zulässig Java Basics - Anfänger-Themen 5
W OOP Objekt Methode Java Basics - Anfänger-Themen 9
A Objekt in Arrayliste Java Basics - Anfänger-Themen 2
B Mit methode Objekt aus anderer Klasse erstellen Java Basics - Anfänger-Themen 6
I Object-Oriented Programming, Objekt erzeugen Java Basics - Anfänger-Themen 1
M Objekt einer Klasse speichert die Veränderung nicht Java Basics - Anfänger-Themen 1
K Konstruktor für ein Objekt mit Zugriffsmethoden Java Basics - Anfänger-Themen 7
S Variablen Klassenvariable über Objekt aufrufen Java Basics - Anfänger-Themen 16
A Zufälliges Objekt basierend auf Wahrscheinlichkeiten bekommen. Java Basics - Anfänger-Themen 4
R Value von einem JSON-Objekt ausgeben Java Basics - Anfänger-Themen 4
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
N Bewegtes Objekt soll sich um eine Parallele bewegen Java Basics - Anfänger-Themen 0
S Objekt-Attribute "variabel" gestalten Java Basics - Anfänger-Themen 10
J Datenbankstruktur als Objekt anlegen Java Basics - Anfänger-Themen 4
L Objekt aus Textdatei in ArrayList speichern Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben