JComponents zur Laufzeit auf JPanel darstellen

Thanathan

Mitglied
Guten Abend!

Ich habe ein (vorerst leeres) JPanel. Zur Laufzeit werden mehrere Objekte meiner Klasse "Blech" erstellt (welche von JComponent erbt), die ich dann auf diesem JPanel anzeigen lassen möchte.
Leider hab ich irgendwo noch ne Kleinigkeit übersehen, jedenfalls bleibt JPanel leer.

Hier erstmal "Blech":

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.io.FileWriter;
import java.util.*;

import javax.swing.JComponent;

// Repräsentiert ein Blech,
// besteht aus Maßen fürs Blech und Liste von Formen
public class Blech extends JComponent
{
    private ArrayList<Form> formen;
    private float blechBreite;
    private float blechLaenge;
   
    public Blech(float breite, float laenge, ArrayList<Form> f)
    {
        formen = f;
        blechBreite = breite;
        blechLaenge = laenge;
    }
   
    // überschreibt die JComponent-Methode
    public void paint(Graphics g)
    {
       drawBlech((Graphics2D) g, getBounds());
    }
   
    void drawBlech(Graphics2D g, Rectangle area)
    {
       g.setColor(Color.white);
       g.fill(new Rectangle2D.Float((float)area.getX(), (float)area.getY(), blechBreite, blechLaenge));
      
       g.setColor(Color.black);
       for(int i = 0; i < formen.size(); i++)
       {
           // hier werden später die Formen aus formen einzeln aufgerufen und auf das Blech drübergemalt; vorerst zu vernachlässigen
       }
   }
}

Ich füge mehrere Bleche ins JPanel graphPanel mit der Funktion zeichneBleche. Unten hab ich erstmal Testsätze erstellt.

Java:
public void zeichneBleche()
    {
        int x = graphPanel.getX()+10;
        int y = graphPanel.getY()+10;
       
        // Test
        float[] floats1 = {(float)0.5, 2, 4}; float[] floats2 = {3, 4, 5};
        FormObjekt f1 = new FormObjekt(floats1, floats2, 1, 3, "Form1");
        float[] floats3 = {0, 2, 4}; float[] floats4 = {3, 4, 5};
        FormObjekt f2 = new FormObjekt(floats3, floats4, 1, 3, "Form2");
        float[] floats5 = {(float)0.5, 2, 4}; float[] floats6 = {3, 4, 5};
        FormObjekt f3 = new FormObjekt(floats5, floats6, 1, 3, "Form3");
        ArrayList<FormObjekt> fl1 = new ArrayList<FormObjekt>();
        fl1.add(f1);
        fl1.add(f2);
        fl1.add(f3);
        Blech b1 = new Blech(20, 10, fl1);
       
        FormObjekt f4 = new FormObjekt(floats1, floats2, 1, 3, "Form1");
        FormObjekt f5 = new FormObjekt(floats3, floats4, 1, 3, "Form2");
        FormObjekt f6 = new FormObjekt(floats5, floats6, 1, 3, "Form3");
        ArrayList<FormObjekt> fl2 = new ArrayList<FormObjekt>();
        fl2.add(f4);
        fl2.add(f5);
        fl2.add(f6);
        Blech b2 = new Blech(20, 10, fl2);     

        bleche.add(b1);
        bleche.add(b2);
        // Test
       
        for(int i = 0; i < bleche.size(); i++)
        {
            Blech b = bleche.get(i);
            graphPanel.add(b);
            b.setBounds(x,y,20,10);
            graphPanel.revalidate();
            graphPanel.repaint();
           
            x = x + 20 + 10;
        }
Wobei der Code da noch nicht durchpoliert ist, mir ist klar dass zb das b.setBounds() so noch sehr unschön ist, aber ich wollte erstmal die Grundlage haben und danach verbessern. :D

bleche ist eine globale ArrayList<Blech> Variable.

zeichneBleche() rufe ich nach dem Druck auf einen Button auf. Im Debugger sehe ich auch, dass die for-Schleife vernünftig durchlaufen wird, aber das Panel bleibt weiterhin leer.
 

Harry Kane

Top Contributor
1. Bei JComponents sollte man nicht paint, sondern paintComponent(Graphics g) überschreiben. Der erste call in der überschriebenen paintComponent sollte super.paintComponent(g) sein.
2. Deine Bleche haben eine preferredSize von 1, 1. Du kannst das gerne per sysout überprüfen. Wenn der LayoutManager die preferredSize berücksichtigt, schrumpfen die Bleche beim layouten auf die Größe eines Pixels. Welchen LayoutManager du verwendest, ist aus deinem bisher geposteten Code nicht ersichtlich.
 

Thanathan

Mitglied
1.) Alles klar, hab ich geändert. Hatte allerdings erstmal keinen sichtbaren Effekt.
2.) Hmm, LayoutManager ist eigentlich auf null gesetzt. Auch wenn ich die preferredSize testweise ändere, ändert sich leider nichts am Ergebnis...
 

Joose

Top Contributor
2.) Hmm, LayoutManager ist eigentlich auf null gesetzt. Auch wenn ich die preferredSize testweise ändere, ändert sich leider nichts am Ergebnis...

Da du keinen LayoutManager verwendest bringt eine Änderung von "preferredSize" nichts (ein LayoutManager würde diese Werte auslesen und umsetzen).
Verwende einen LayoutManager und du wirst deine Bleche sehen. Nimm Abstand vom null-Layout => http://www.fredosaurus.com/notes-java/GUI/layouts/nulllayout.html
 

Thanathan

Mitglied
Schade, ich mag eigentlich, dass man alle Teile beliebig positionieren kann. Aber gut, dann puzzle ich mir mal was zusammen^^
FlowLayout hat ebenfalls nichts gebracht, mal schauen ob BorderLayout mehr bringt. Momentan spuckt er mir noch ne Exception aus, muss wahrscheinlich noch den restlichen Code etwas anpassen.
 

Harry Kane

Top Contributor
Hast du meinen Beitrag gelesen?
LayoutManager ist eigentlich auf null gesetzt
FlowLayout hat ebenfalls nichts gebracht, mal schauen ob BorderLayout mehr bringt
Von welchem Container redest du? Vom graphPanel, oder dem Container in dem graphpanel liegt?
Einer JComponent (und das bedeutet auch: einem JPanel) kann man entweder eine feste preferredSize verpassen, oder man kann sie durch den LayoutManager berechnen lassen. Diese size kann durch den LayoutManager des Containers, in dem die JComponent liegt, berücksichtigt werden oder auch nicht.
Wenn dein graphPanel weder eine manuell gesetzte preferredSize noch einen LayoutManager hat, solltest du nur dann dein graphPanel (und die darin enthaltenen Bleche) sehen, wenn das graphPanel durch den Container in dem es liegt, eine sichtbare Größe bekommt.
 

Thanathan

Mitglied
Meine Umgebung, also der Container in dem alles liegt, ist ein JFrame mit null-Layout. Hatte das oben so verstanden, dass ich das Layout des JPanels graphPanel ändern sollte.
Bisher hatte ich eigentlich alles auf null um es exakt positionieren zu können.

Meines Wissens wird preferredSize() doch sowieso nur von LayoutManagern verwendet? Aus welchem Grund funktioniert dann hier setBounds() nicht? Das JPanel konnte ich ja auch manuell positionieren, wo ist der Unterschied zu meinen Blechen? Sie werden auch nicht als einzelne Pixel dargestellt, von daher hätte ich den Fehler eigentlich woanders vermutet...
Sorry, bin gerade etwas verwirrt, sehe wahrscheinlich den Wald vor lauter Bäumen nicht :D
 

Harry Kane

Top Contributor
Meine Umgebung, also der Container in dem alles liegt, ist ein JFrame mit null-Layout.
Ich nehme an, "alles" beinhaltet auch das graphPanel? Wenn das JFrame ein null-Layout hat, musst du beim graphPanel auch die bounds manuell setzen. Davon ist aber in deinem Code nichts zu sehen. Wenn dein graphPanel seine bounds weder manuell noch durch den LayoutManager des JFrame gesetzt bekommt, sollte graphPanel eigentlich eine Größe von 1,1 oder 0, 0 haben. Es kann sein, dass dann auch Kindkomponenten von graphPanel nicht gezeichnet werden, selbst wenn diese Kindkomponenten bounds größer als 1,1 sind.
Allmählich bin ich aber auch verwirrt.
Zeige mal ein komplettes lauffähiges Program, was das falsche Verhalten zeigt.
 

Thanathan

Mitglied
Ja, ist vielleicht besser so. Sorry für die Verwirrung :D

Java:
import javax.swing.*;
import java.io.File;
import java.io.FileWriter;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import java.awt.geom.Rectangle2D;
import java.lang.Math;

public class Gui extends JFrame implements ActionListener
{
    // GUI Komponenten
    private JButton waehleDateiButton;
    private JButton berechneLoesungButton;
    private JButton gebeTextfileButton;
    private JLabel dateiNameLabel;
    private JPanel panel; // Buttons etc.
    private JPanel graphPanel; // Anzeige der Ausgabe

    ArrayList<Blech> bleche = new ArrayList<>();
  
    public Gui()
    {
        // Erschaffen der Komponenten
        panel = new JPanel();
        graphPanel = new JPanel();
        dateiNameLabel = new JLabel();
        waehleDateiButton = new JButton("Wähle Fertigungsplan:");
        berechneLoesungButton = new JButton ("Berechne Anordnung");
        gebeTextfileButton = new JButton ("Ergebnis im Textformat");
        
        // Layout + Eventhandling
        panel.setBounds(10, 10, 500, 190);
        panel.setLayout(null);
        panel.setBackground(Color.red);
        panel.add(waehleDateiButton);
        panel.add(dateiNameLabel);
        panel.add(berechneLoesungButton);
        panel.add(gebeTextfileButton);
        graphPanel.setBackground(Color.green);
        graphPanel.setBounds(10,260,790,550);
        graphPanel.setLayout(new FlowLayout());
        waehleDateiButton.addActionListener(this);
        waehleDateiButton.setBounds(10,10,200,30);
        berechneLoesungButton.addActionListener(this);
        berechneLoesungButton.setBounds(10,50,200,30);
        gebeTextfileButton.addActionListener(this);
        gebeTextfileButton.setBounds(10,90,200,30);
        dateiNameLabel.setBounds(220,10,200,30);
      
        // Die Panels werden auf der GUI angezeigt
        Container contentPane = getContentPane();
        contentPane.add(panel, BorderLayout.NORTH);
        contentPane.add(graphPanel);
      
        // GUI Einstellungen
        this.setTitle("Titel");
        this.setSize(900,900);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(null);
        this.setVisible(true);
    }
   
    public void actionPerformed (ActionEvent ae)
    {
        if(ae.getSource() == this.waehleDateiButton)
        {
            // hiermit wird die Eingabedatei ausgewählt
        }
        else if(ae.getSource() == this.berechneLoesungButton)
        {
                try
                {   
                        this.zeichneBleche();
                }
                catch(Exception e){}
        }
        else if(ae.getSource() == this.gebeTextfileButton)
        {
            // andere Funktion
        }
    }
    
    public void zeichneBleche()
    {
        int x = graphPanel.getX()+10;
        int y = graphPanel.getY()+10;
      
        // Test
        float[] floats1 = {(float)0.5, 2, 4}; float[] floats2 = {3, 4, 5};
        Form f1 = new Form(floats1, floats2, 1, 3, "Form1");
        float[] floats3 = {0, 2, 4}; float[] floats4 = {3, 4, 5};
        Form f2 = new Form(floats3, floats4, 1, 3, "Form2");
        float[] floats5 = {(float)0.5, 2, 4}; float[] floats6 = {3, 4, 5};
        Form f3 = new Form(floats5, floats6, 1, 3, "Form3");
        ArrayList<Form> fl1 = new ArrayList<Form>();
        fl1.add(f1);
        fl1.add(f2);
        fl1.add(f3);
        Blech b1 = new Blech(20, 10, fl1);
      
        Form f4 = new Form(floats1, floats2, 1, 3, "Form1");
        Form f5 = new Form(floats3, floats4, 1, 3, "Form2");
        Form f6 = new Form(floats5, floats6, 1, 3, "Form3");
        ArrayList<Form> fl2 = new ArrayList<Form>();
        fl2.add(f4);
        fl2.add(f5);
        fl2.add(f6);
        Blech b2 = new Blech(20, 10, fl2);
      
        bleche.add(b1);
        bleche.add(b2);
        // Test
      
        for(int i = 0; i < bleche.size(); i++)
        {
            Blech b = bleche.get(i);
            b.setBounds(x,y,20,10);
            b.setSize(20,10);
            graphPanel.add(b);
            graphPanel.revalidate();
            graphPanel.repaint();
          
            x = x + 20 + 10;
        }
    }
}

(Gui wird einfach von meiner main-Methode initialisiert)
Java:
public class Applikation
{
    public static void main(String[] args)
    {
        Gui meineGui = new Gui();
        meineGui.setVisible(true);
    }
}

Also ich hab für graphPanel schon die bounds gesetzt. Die Panels und Buttons und alles werden auch korrekt angezeigt, nur die zeichneBleche-Methode bewirkt nichts sichtbares (also auch keine 1x1 Pixel Bleche).

Die "Blech" Klasse hatte ich oben ja schon geschrieben, nur getter/setter etc. weggelassen. Hätte den Fehler spontan eher dort vermutet, da ich mit anderen JComponents (den Buttons etc) ja keine Probleme hatte.

Danke schon mal im Voraus :D
 

Harry Kane

Top Contributor
Ich habe in den letzten Tagen immer mal wieder hierüber gebrütet. Die Lösung ist ganz einfach:
Alle Koordinaten für Zeichenoperation in der paintComponent verwenden die linke obere Ecke als Ursprung. Die bounds beziehen sich allerdings auf die Koordinaten relativ zum Elterncontainer.
In der drawBlech-Methode muss es also einfach
Java:
g.fill(new Rectangle2D.Float(0.0f, 0.0f, blechBreite, blechLaenge));
heissen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Swing Wie sollte man seine JComponents vererben? AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
L JComponents vertauschen AWT, Swing, JavaFX & SWT 2
L JComponents in Array AWT, Swing, JavaFX & SWT 11
A Swing Darstellung von JComponents in Swing AWT, Swing, JavaFX & SWT 14
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
M JComponents wird nicht anggezeigt AWT, Swing, JavaFX & SWT 5
P Selbstgezeichnete JComponents AWT, Swing, JavaFX & SWT 5
H Drag&Drop von JComponents AWT, Swing, JavaFX & SWT 6
G JComponents tag vergeben AWT, Swing, JavaFX & SWT 6
M Linie zwischen JComponents AWT, Swing, JavaFX & SWT 5
T JComponents abändern/modifizieren z.b. JSlider AWT, Swing, JavaFX & SWT 2
N Rahmen zum editieren der Größe eines JComponents? AWT, Swing, JavaFX & SWT 2
N Mehrere JComponents übereinander AWT, Swing, JavaFX & SWT 3
G JComponents AWT, Swing, JavaFX & SWT 4
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
0 Ist "sequence.fallback" aus den font.properties zur Laufzeit änderbar AWT, Swing, JavaFX & SWT 0
Davee JavaFX ListView = null wenn ich sie in Laufzeit ändern will! AWT, Swing, JavaFX & SWT 16
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
S JavaFX ListView Inhalte während Laufzeit ändern AWT, Swing, JavaFX & SWT 23
Neumi5694 Schriftgröße zur Laufzeit AWT, Swing, JavaFX & SWT 4
D JavaFX Internationalisierung zur Laufzeit AWT, Swing, JavaFX & SWT 7
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
B 3D-Grafik Java 3D Licht während Laufzeit ändern AWT, Swing, JavaFX & SWT 0
Joew0815 Dropdown meue während der Laufzeit ändern. AWT, Swing, JavaFX & SWT 6
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
U Swing JTextField zur Laufzeit auf Eingaben prüfen AWT, Swing, JavaFX & SWT 0
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
SimonRap Swing JFrame Größe zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
A Panels in JavaFX zur Laufzeit erzeugen AWT, Swing, JavaFX & SWT 5
K Panel zu Laufzeit ändern AWT, Swing, JavaFX & SWT 6
D Änderungen einer Card des CardLayouts zur Laufzeit AWT, Swing, JavaFX & SWT 6
hdi Shift Modifier zur Laufzeit ermitteln AWT, Swing, JavaFX & SWT 3
S Swing Tabelleneigenschaften zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
S GUI per XML zur Laufzeit laden AWT, Swing, JavaFX & SWT 5
R LookAndFeel LAF zur Laufzeit umschalten AWT, Swing, JavaFX & SWT 6
darekkay Swing Komponente zur Laufzeit neuinitialisieren AWT, Swing, JavaFX & SWT 6
C Swing Toolbar zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 5
H JFrame in der Laufzeit verändern AWT, Swing, JavaFX & SWT 11
Ollek Realisierung: JTable zur Laufzeit mit neuen Daten füllen AWT, Swing, JavaFX & SWT 3
S Swing JTextArea während der Laufzeit füllen AWT, Swing, JavaFX & SWT 5
Ollek Text in JTextField und JTextArea zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
L Swing Image zur Laufzeit verändern AWT, Swing, JavaFX & SWT 6
R JFreeChart Skalierung zur Laufzeit ändern AWT, Swing, JavaFX & SWT 7
L systemtray zur laufzeit ändern AWT, Swing, JavaFX & SWT 2
N Swing Threads sollen Tabtitel zur Laufzeit ändern AWT, Swing, JavaFX & SWT 4
F Swing Zur Laufzeit Bild laden und auf JPanel anzeigen AWT, Swing, JavaFX & SWT 4
A Komponenten zur Laufzeit entfernen AWT, Swing, JavaFX & SWT 3
B Uberschrift in Swing-Programm zur Laufzeit aendern... AWT, Swing, JavaFX & SWT 4
D Panels Dynamisch zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 2
D LayoutManager GridBagLayout, Änderung zur Laufzeit AWT, Swing, JavaFX & SWT 4
S Canvas-Inhalt in Laufzeit ändern AWT, Swing, JavaFX & SWT 6
Q 3D-Grafik Cube Farbe setzen zur Laufzeit. AWT, Swing, JavaFX & SWT 10
E Swing JList zur Laufzeit hinzugefügt elemente nicht sichtbar?! AWT, Swing, JavaFX & SWT 2
E Swing Zur Laufzeit hinzegfügte Komponenten nicht sofort sichtbar?! AWT, Swing, JavaFX & SWT 4
G Swing Icons von JLabel zur Laufzeit ändern AWT, Swing, JavaFX & SWT 3
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
A Swing JLabel in Laufzeit vergrößern AWT, Swing, JavaFX & SWT 3
U JTabbedPane: Layout-Probleme bei addTab zur Laufzeit AWT, Swing, JavaFX & SWT 2
A Komponente zur Laufzeit hinzufügen und RICHTIG anzeigen AWT, Swing, JavaFX & SWT 3
G StackOverflow nach einem Tag Laufzeit AWT, Swing, JavaFX & SWT 11
F Swing JTabbedPane: Zur Laufzeit die Tabreihenfolge ändern AWT, Swing, JavaFX & SWT 2
eQuest Swing Einem JFrame zur Laufzeit ein Panel zuweisen AWT, Swing, JavaFX & SWT 5
S initialnamen einer swing instanz zur laufzeit ändern AWT, Swing, JavaFX & SWT 5
M Swing JTable während Laufzeit beschreiben AWT, Swing, JavaFX & SWT 14
multiholle [Swing] GUI zur Laufzeit ändern AWT, Swing, JavaFX & SWT 7
L GUI Komponenten zur Laufzeit entfernen AWT, Swing, JavaFX & SWT 4
A SWT - Elemente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
N JList (JXList) ListCellRenderer zur Laufzeit ändern (Anzeigefehler) AWT, Swing, JavaFX & SWT 6
G Komponente zur Laufzeit tauschen. AWT, Swing, JavaFX & SWT 5
O Zeichnene auf ein Jpanel während der Laufzeit des Programms AWT, Swing, JavaFX & SWT 2
M Erzeugen von Komponenten während der Laufzeit AWT, Swing, JavaFX & SWT 6
T SWT/Eclipse Form Controls zur Laufzeit hinzufügen,GridLayout AWT, Swing, JavaFX & SWT 4
S Methode während ihrer Laufzeit abbrechen AWT, Swing, JavaFX & SWT 6
G Text zur Laufzeit einblenden? AWT, Swing, JavaFX & SWT 2
P SWT: Composi te zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 3
M Sprache zur Laufzeit ändern AWT, Swing, JavaFX & SWT 3
R JFrame: Inhalt zur Laufzeit ändern AWT, Swing, JavaFX & SWT 7
J GUI JPanel zur Laufzeit austauschen. AWT, Swing, JavaFX & SWT 6
DeeDee0815 LookAndFeel während der Laufzeit verstellen AWT, Swing, JavaFX & SWT 4
padde479 Look And Feel zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
D Widget/Control während Laufzeit durch ein anderes ersetzen AWT, Swing, JavaFX & SWT 3
C Zeile aus Tabelle zur Laufzeit löschen AWT, Swing, JavaFX & SWT 6
C Inhalt JTextField zur Laufzeit ändern. AWT, Swing, JavaFX & SWT 14
B JButton während der Laufzeit in JLabel umwandeln AWT, Swing, JavaFX & SWT 3
P JTextArea veränder Größe während Laufzeit; GridBagLayout AWT, Swing, JavaFX & SWT 8
B JList zur Laufzeit aktualisieren AWT, Swing, JavaFX & SWT 2
R JTable: Column Titel zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
D JComponets während der Laufzeit in ein Panel einfügen AWT, Swing, JavaFX & SWT 2
S Komponente zur Laufzeit hinzufügen & Vergrößern einschrä AWT, Swing, JavaFX & SWT 3
G SWT: wie aktualisiere ich ein Canvas zur Laufzeit? AWT, Swing, JavaFX & SWT 4
S Problem, neuen JInternalFrame zur Laufzeit anzuzeigen AWT, Swing, JavaFX & SWT 8
D JTable Header während Laufzeit ändern. AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben