Nachträglich neue grafische Objekte hinzufügen

Carcharoth

Bekanntes Mitglied
Guten Abend

Ich habe eine Klasse Draw welche von JPanel erbt.
Darin zeichne ich etwas in dem ich die Methode paintComponent überschreibe.

Ich möchte später im Programm, durch verschiedene Umstände ausgelöst (z.B. einen Mausklick), weitere grafische Elemente (Rechtecke, Kreise, Linien, usw.) einfügen können. Mein Problem ist dabei, dass ich alles was ich zeichne in der Methode paintComponent einbauen muss. Ich weiss aber nicht von Anfang an, was später alles gezeichnet werden muss.

Java:
public class Draw extends JPanel {
    public Draw() {
        setBounds(0,0,800,600);
        Handler handler = new Handler();
        this.addMouseListener(handler);
    }
    
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillOval(300, 300, 200, 100);
        repaint();
    }
    
    private class Handler implements MouseListener {
        @Override
        public void mouseClicked(MouseEvent e) {
            // neues grafische Element hinzufügen (Rechteck, Kreis, Linie, usw.)
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {}

        @Override
        public void mouseExited(MouseEvent arg0) {}

        @Override
        public void mousePressed(MouseEvent arg0) {}

        @Override
        public void mouseReleased(MouseEvent arg0) {}
    }
}

Ich habe mir überlegt, dass ich eine innere Klasse Element (extends JPanel) bauen könnte die die Aufgabe hat jedes neues grafische Element zu beherbergen.
Mit Aufruf ihrer repaint-Methode könnte ich es zeichnen lassen.

Könnte dieser Ansatz funktionieren?

Nun tue ich mich schwer dem Konstruktor von Element ein gescheiter Parameter zu übergeben damit Element weiss was es ist (z.B. ein Rechteck, ein Kreis, eine Linie, usw.). Am liebsten würde ich ein Parameter eines übergeordneten Typs (Graphics?) übergeben. Die Klasse Element wüsste dann was zu zeichnen ist.

Kann ich das so generisch machen (man darf ja träumen) oder muss ich für jedes graphisches Element welches ich später hinzufügen will eine eigene Klasse bauen (eine für Rechtecke, eine für Kreise, eine für Linien, usw.)?

Danke und Gruss
 

Carcharoth

Bekanntes Mitglied
Auf dem Weg zu der Lösung, versuche ich zuerst eine innere Klasse Element zu bauen und eine Instanz davon im Konstruktor von Draw hinzuzufügen und zeichnen lassen. Klappt aber nicht. Irgendwie kann ich machen was ich will, es kommt immer nur ein kleines blaues Viereck oben mittig gezeichnet.

Danke für eure Tipps.

Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Draw extends JPanel {
    // Konstruktor von Draw
    public Draw() {
        setBounds(0,0,800,600);

        Element neuesElement = new Element();
        this.add(neuesElement);
    }

    // überschriebene paintComponent von Draw
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillOval(300, 300, 200, 100);
        repaint();
    }

    private class Element extends JPanel {
        // Konstruktor von Element
        Element() {
            this.setBounds(0,0,800,600);
        }

        // überschriebene paintComponent von Element
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.BLUE);
            g.fillRect(0, 0, 200, 200);
            repaint();
        }
    }
}

Java:
import javax.swing.JFrame;

public class Fenster extends JFrame {

    public Fenster() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800,600);
        setLocationRelativeTo(null);

        Draw draw = new Draw();
        this.add(draw);

        setVisible(true);
    }

    public static void main(String[] args) {
        Fenster meinFenster = new Fenster();
    }
}
 

mihe7

Top Contributor
versuche ich zuerst eine innere Klasse Element zu bauen und eine Instanz davon im Konstruktor von Draw hinzuzufügen und zeichnen lassen
Das Problem ist, dass Element eine Komponente ist. Hier schlägt dann der LayoutManager zu. Wenn ich Dich richtig verstanden habe, willst Du aber keine UI-Komponenten hinzufügen, sondern grafische Objekte, oder?
 

mihe7

Top Contributor
Hier mal was zum Spielen:

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import java.util.*;
import java.util.List; // wg. awt

interface Drawable {
    void paint(Graphics2D g);
}

class DrawableShape implements Drawable {
    private Shape shape;
    private Stroke stroke;
    private Paint fill;

    public DrawableShape(Shape shape, Stroke stroke, Paint fill) {
        this.shape = shape;
        this.stroke = stroke;
        this.fill = fill;
    }

    @Override
    public void paint(Graphics2D g) {
        g.setPaint(fill);
        g.setStroke(stroke);
        if (fill != null) {
            g.fill(shape);
        } else {
            g.draw(shape);
        }
    }
}
    

class DrawingPane extends JComponent {
    private List<Drawable> elements = new LinkedList<>();

    public void add(Drawable element) {
        elements.add(element);
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        
        for (Drawable e : elements) {
            e.paint(g2);
        }
    }    
}

public class Draw {

    private DrawingPane drawings;
   

    public void run() {
        drawings = new DrawingPane();
        drawings.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                addEllipse(e.getPoint());
            }
        });
                
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(drawings);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    private void addEllipse(Point2D p) {
        Ellipse2D ellipse = new Ellipse2D.Double(
                     p.getX() - 25, p.getY() - 25, 50, 50);
        
        Stroke dashed = new BasicStroke(2.0f,
                                        BasicStroke.CAP_BUTT,
                                        BasicStroke.JOIN_MITER,
                                        10.0f, new float[]{10.0f}, 0f);

        DrawableShape drawable = new DrawableShape(ellipse, dashed, null);
        drawings.add(drawable);        
    }    

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Draw().run());
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
P Wie Java-Plugin in Firefox (nachträglich) installieren? Java Basics - Anfänger-Themen 2
R Grafische Benutzeroberfläche GUI nachträglich einbauen Java Basics - Anfänger-Themen 3
M Objekt Name für MethodenAufruf nachträglich zuweisen? Java Basics - Anfänger-Themen 2
K Klassen Nachträglich ein Objekt einem anderen zuweisen, geht das? Java Basics - Anfänger-Themen 2
K Nachträglich auf Objekte zugreifen Java Basics - Anfänger-Themen 2
P Nachträglich Klasse zu Package hinzufügen Java Basics - Anfänger-Themen 16
IngoF wie kann man die Console nachträglich öffnen? Java Basics - Anfänger-Themen 6
B JPanel nachträglich verändern Java Basics - Anfänger-Themen 20
T Nachträglich Erben Java Basics - Anfänger-Themen 7
G Dateiname nachträglich mit endung versehen Java Basics - Anfänger-Themen 5
G JLabel nachträglich verändern, bzw. ImageIcon ändern? Java Basics - Anfänger-Themen 3
F Properties nachträglich hinzufügen Java Basics - Anfänger-Themen 3
V public nachträglich in public static umwandeln /JFormDesigne Java Basics - Anfänger-Themen 5
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
F Erste Schritte Zahlenreihe von Arraylist in 3erBlöcke sortiert in neue Arraylist Java Basics - Anfänger-Themen 2
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
J Neue Werte in ein Array hinzugeben Java Basics - Anfänger-Themen 8
V Neue Ausgabe von toString nach Methodenaufruf Java Basics - Anfänger-Themen 9
B Objekt an neue Stage übergeben? Java Basics - Anfänger-Themen 9
L Neue Klasse für TableView? Java Basics - Anfänger-Themen 17
tsom Erste Schritte itext Text als Block auf neue Seite Java Basics - Anfänger-Themen 0
T Zufällige Matrix in neue Matrix schreiben Java Basics - Anfänger-Themen 6
M BufferedReader neue Zeile nach Knopfdruck Java Basics - Anfänger-Themen 9
S drawString() neue Zeile Java Basics - Anfänger-Themen 4
H Aus wav-datei lesen und in neue wav-datei speichern Java Basics - Anfänger-Themen 10
E Wenn i (for-Loop) bestimmter Wert, dann neue Zeile eines Buttons Java Basics - Anfänger-Themen 7
Hijo2006 Neue externe Klasse einbinden Java Basics - Anfänger-Themen 13
W Neue Klassenmethode implementieren.. Java Basics - Anfänger-Themen 6
U neue Methoden in JSP??? Java Basics - Anfänger-Themen 1
L0MiN Erste Schritte Neue Punkte zu einer Map hinzufügen und dauerhaft speichern? Java Basics - Anfänger-Themen 4
N wie schreibt man die neue for schleife? Java Basics - Anfänger-Themen 3
D Wie erstelle ich eine neue Hauptklasse mit eclipse? Java Basics - Anfänger-Themen 3
D neue public static class variablen in array speichern? Java Basics - Anfänger-Themen 6
B Neue Bibliothek hinzufügen Java Basics - Anfänger-Themen 2
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
M FileWriter Neue Datei wenn aktuelle "zu groß" Java Basics - Anfänger-Themen 3
C auslesen bestimmter werte einer textdatei und anschl. hineinschreiben in eine neue txt-datei. Java Basics - Anfänger-Themen 2
R csv-Datei auslesen und ausgelesene Daten in neue csv-Datei speichern Java Basics - Anfänger-Themen 2
D Neue Array übernimmt Werte des alten nicht Java Basics - Anfänger-Themen 5
J Neue Zeile an bestimmter Stelle in Textdatei einfügen Java Basics - Anfänger-Themen 2
M Neue Objekte mit Hilfe von String Variable erschaffen Java Basics - Anfänger-Themen 2
I Neue Klassenbibliothek erstellen Java Basics - Anfänger-Themen 8
K Iteration - Alte und neue For Schleife Java Basics - Anfänger-Themen 17
M Klassen Eine Klasse abrufen ohne eine neue Instanze auf zu rufen? Java Basics - Anfänger-Themen 8
C Vector erzeugt neue Indizes nach Input Java Basics - Anfänger-Themen 2
S neue Methode schreiben Java Basics - Anfänger-Themen 14
E Variable neue Random Zahl zuweisen, wenn Button geklickt Java Basics - Anfänger-Themen 5
J Werte ins neue Fenster übertragen Java Basics - Anfänger-Themen 6
G Ausgabe nach 5 Zeichen in neue Zeile schreiben??? Java Basics - Anfänger-Themen 12
A Werte per Zufall aus einer Datei ziehen und in eine neue Datei schreiben Java Basics - Anfänger-Themen 9
F Variablen Übergabe von eingelesenen Variablen in neue Klasse Java Basics - Anfänger-Themen 15
U neue Java-Datei öffnen Java Basics - Anfänger-Themen 10
S Itext und eine neue Zeile einfügen Java Basics - Anfänger-Themen 2
Corben Input/Output FileOutputStream - neue Zeile mit write(10) Java Basics - Anfänger-Themen 6
K in Konstruktor neue Objekte einer anderen Klasse erzeugen Java Basics - Anfänger-Themen 9
S Datenströne - Text in eine Datei einlesen, umwandeln und in eine neue Datei schreiben Java Basics - Anfänger-Themen 6
F Neue Klasse mag nicht - nullPointerException Java Basics - Anfänger-Themen 6
L String suchen und ersetzten, ohne neue Datei Java Basics - Anfänger-Themen 4
X FileHandler: neue Datei erzeugen Java Basics - Anfänger-Themen 2
U Java neue Variable für jeden Schleifendurchgang Java Basics - Anfänger-Themen 11
K Neue Menge aus zwei Mengen konstruieren Java Basics - Anfänger-Themen 3
Luk10 Dateipfad beim Laden einer Datei + Neue kleine Frage! Java Basics - Anfänger-Themen 11
Hindi93 Neue Libs - wohin damit? Java Basics - Anfänger-Themen 7
G JUnit ist das neue main() Java Basics - Anfänger-Themen 16
M neue Zufallszahl in Schleife Java Basics - Anfänger-Themen 2
M java neue datei erstellen Java Basics - Anfänger-Themen 6
V Scanner Einlese aus Datei in neue Datei? Java Basics - Anfänger-Themen 8
Haubitze_Broese neue Klasse? Java Basics - Anfänger-Themen 6
F Neue Panelgröße nach Fenster maximieren Java Basics - Anfänger-Themen 5
S FileWriter - in neue Zeile schreiben!? Java Basics - Anfänger-Themen 19
P OOP Automatisch neue Objekte erstellen Java Basics - Anfänger-Themen 14
L Neue Zeile JTable Java Basics - Anfänger-Themen 13
B Eine neue Klasse in anderen Projekten nutzen Java Basics - Anfänger-Themen 5
W neue Variablen in Schleife anlegen Java Basics - Anfänger-Themen 13
S GridBagLayout neue Objekte hinzufügen Java Basics - Anfänger-Themen 3
M Action als neue Klasse Java Basics - Anfänger-Themen 2
B Teile einer Image in neue Image kopieren Java Basics - Anfänger-Themen 4
E Neue zeile in string Java Basics - Anfänger-Themen 3
L Mit Array neue Objekte erzeugen Java Basics - Anfänger-Themen 3
R Zeichnung entfernen und neue Zeichnen lassen Java Basics - Anfänger-Themen 20
R Neue GUI öffnen und die Alte schließen Java Basics - Anfänger-Themen 6
J ArrayList<Point> in eine neue ArrayList<Point> kopieren Java Basics - Anfänger-Themen 8
D Wie neue Instanz einer Klasse erstellen, von der ich nur eine andere Instanz kenne? Java Basics - Anfänger-Themen 13
S Stilfrage: Neue Klasse wenn es in einer Klasse zu viele Methoden gibt? Java Basics - Anfänger-Themen 14
G neue Instanz von ArrayList Java Basics - Anfänger-Themen 5
Zed Übergang von Kalenderwochen ins neue Jahr Java Basics - Anfänger-Themen 19
W JTextfield in neue Zeile einfügen Java Basics - Anfänger-Themen 5
JFeel-x Kann man in Eclipse neue Shortcuts erstellen? Java Basics - Anfänger-Themen 17
GambaJo Ab wann neue Klasse erzeugen? Java Basics - Anfänger-Themen 2
S Auf neue Dateien überprüfen Java Basics - Anfänger-Themen 2
Q java.util.loggging neue datei erstellen Java Basics - Anfänger-Themen 3
M Neue Pakete implementieren Java Basics - Anfänger-Themen 5
D neue Datei inkl. Ordner erstellen - in einem Rutsch? Java Basics - Anfänger-Themen 7
H ist eine "neue Session" für Mail möglich? Java Basics - Anfänger-Themen 3
G FileWriter -> neue Zeile Java Basics - Anfänger-Themen 13
S PrepareStatement, jede neue Zeile INT-Wert Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben