Bildbetrachter erweitern

Status
Nicht offen für weitere Antworten.
G

Gast_Anfänger

Gast
Hallo,

ist es möglich den Bildbetrachter in folgenden Thema um die folgenden Funktionen zu erweitern?

1. gleichzeitige Anzeige von mehr als einen Bild.
2. die Auswahl der Bildern so vereinfachen, dass Bilderverzeichnisse wählbar sind und der gesamte Inhalt somit dargestellt werden kann.
 

0x7F800000

Top Contributor
0) ich hab keine ahnung worum es bei diesem "Thema" ging, hab grad leider keine zeit mir das alles durchzulesen
1) was soll da das problem sein? du lädst dir die bilder, packst die auf irgendwelche JComponents-Derivate oder ähnliches und zeigst die eben an...
2) Da, ein minimales beispiel ( :!: Die GUI ist sehr extremst übelst grauenvoll, liebe mitbürger, bitte nicht nachmachen!!! :!: ) Es geht also nur darum, dass mehrere bilder geladen, vom restlichen quatsch gefiltert und dargestellt werden:

Code:
import java.awt.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.io.*;

import javax.imageio.*;

public class LoadingPic {
public static void main(String[] args){
	
	final int FRAME_WIDTH=760; //<----ECKLIG, NICHT NACHBAUEN!
	
	JFrame frame=new JFrame("LoadingPic");
	frame.setSize(FRAME_WIDTH,FRAME_WIDTH);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setResizable(false);
	frame.setVisible(true);
	
	JFileChooser fileChooser=new JFileChooser();
	fileChooser.setFileFilter(new FileFilter(){
		public boolean accept(File f){
			return f.isDirectory()||
			f.getName().toLowerCase().endsWith(".gif")||
			f.getName().toLowerCase().endsWith(".jpg");
		}
		public String getDescription(){
			return "jpg, gif";
		}
	});
	fileChooser.showOpenDialog(null);
	
	File[] files=fileChooser.getCurrentDirectory().listFiles(new FilenameFilter(){
		public boolean accept(File f, String s) {
			return s.toLowerCase().endsWith(".gif")||
			s.toLowerCase().endsWith(".jpg");
		}
		
	});
	Image[] img=new Image[files.length];
	
	for(int i=0; i<files.length; i++){
		System.out.println(files[i].getName());
		try{
			img[i]=ImageIO.read(files[i]);
		}catch(IOException e){
			System.out.println(e);
		}
	}
	
	//ACHTUNG!!! ECKELHAFTER CODE!!!
	int picsInRow=(int)(Math.sqrt(img.length)+1);
	int picWidth=(int)(FRAME_WIDTH/(float)picsInRow);
	
	for(int x=0; x<picsInRow; x++){
	for(int y=0; y<picsInRow; y++){
		if(x+y*picsInRow<img.length){
			frame.getContentPane().getGraphics().drawImage(
			img[x+y*picsInRow], x*picWidth, y*picWidth, picWidth, picWidth, frame.getContentPane());
		}
	}
	}
	
}
}
so. wenn du jetzt in irgendeinen ordner kommst, und dort ein bild anklikst, werden alle bilder aus dem ordner geladen. Das ist nicht sonderlich fein, man sollte eigentlich einstellen, dass man ordner und nicht einzelne dateien auswählen kann, aber das sind feinheiten, im großen und ganzen funktioniert es... Hoffentlich hilft dir das irgendwie weiter...
 
G

Gast_Anfänger

Gast
Unkontrolliert ein Verzeichnis auszulesen habe ich schon, das Problem ist aber das es kontrolliert sein soll.

Das ist bisher der Code dazu, mit welchen man sich aber nur ein Bild zeichnen lassen kann.

Code:
public class Browser extends JFrame {
static Bildbetrachter fenster;
Image bild;

int index = 0;
int x_pos,y_pos;
String name;
CBildLeinwand bildanzeige;
File[] dateiweg;

private JFileChooser chooser;

  int bild_x1,bild_y1;        // die aktuelle Begrenzung
  int bild_x2,bild_y2;        // des Bildes
  int bildBreite,bildHoehe;
  

class ActionLauscher implements ActionListener {
   public void actionPerformed(ActionEvent e) {
   String Label;

   Label = e.getActionCommand();

   if (Label.equals("Objektbrowser")){
     laden();
   
}

   if (Label.equals("beenden"))
     System.exit(0);

if(Label.equals("weiter")){
index++;
  if(index > dateiweg.length-1) {
         index = 0;
          }
ImageIcon tmp = new ImageIcon(dateiweg[index].getAbsolutePath());
bild = tmp.getImage();
   }
   

if(Label.equals("zurück")){
index--;
  if(index < 0) {
         index = dateiweg.length-1;
         }
ImageIcon tmp = new ImageIcon(dateiweg[index].getAbsolutePath());
bild = tmp.getImage();
}
   repaint();
   }
}

Bildbetrachter (String titel) {
  super(titel);

x_pos = y_pos ;
bild_x1 = bild_x2 = bild_y1 = bild_y2;

name = null;
bild = null;

setLayout(new BorderLayout());

bildanzeige  = new CBildLeinwand();
bildanzeige.setSize(1024,300);
add(bildanzeige,BorderLayout.NORTH);
bildanzeige.setBackground(Color.white);
JPanel Button = new JPanel();
JButton weiter = new JButton("weiter");
JButton zurück = new JButton("zurück");

Button.add(zurück);
Button.add(weiter);
add(Button,BorderLayout.SOUTH);
weiter.addActionListener(new ActionLauscher());
zurück.addActionListener(new ActionLauscher());

JScrollPane listenScrollPane = new javax.swing.JScrollPane();
listenScrollPane.setViewportView(bildanzeige);
add(listenScrollPane);   


JMenuBar menuleiste = new JMenuBar();
setJMenuBar(menuleiste);

JMenu menu = new JMenu("Datei"); //menu erstellen

JMenuItem laden = new JMenuItem("Objektbrowser"); //Menubutton laden
laden.addActionListener(new ActionLauscher());


JMenuItem beenden = new JMenuItem("beenden");
beenden.addActionListener(new ActionLauscher());
menu.add(laden);

menu.add(beenden);
menuleiste.add(menu);

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

}
public void laden(){

  chooser = new JFileChooser();
  chooser.setMultiSelectionEnabled(true);
  if (chooser.showOpenDialog(bildanzeige) ==
                                JFileChooser.APPROVE_OPTION){
                                   
dateiweg = chooser.getSelectedFiles();
if (dateiweg == null) {
return;
}
if(dateiweg.length>0)
   name = dateiweg[0].getName();
 
}
     
bildBreite = bild.getWidth(bildanzeige);
bildHoehe = bild.getHeight(bildanzeige);


bild_x1 = x_pos;
bild_y1 = y_pos;
bild_x2 = bild_x1 + bildBreite;
bild_y2 = bild_y1 + bildHoehe;
bildanzeige.setSize(bildBreite,bildHoehe);
bildanzeige.repaint();
}

public static void main(String[] args){
fenster = new Bildbetrachter("Bildbetrachter");
fenster.setSize(1024,300);

fenster.pack();
fenster.setLocation(30,50);
fenster.setVisible(true);
}

class CBildLeinwand extends JPanel {

   
    // Panel neu zeichnen
    public void paintComponent(Graphics g) {
      super.paintComponent(g);

    // Falls ein Bild geladen ist, das Bild anzeigen
    if(bild != null)
        g.drawImage(bild,x_pos,y_pos,this);
    } 
    
    public Dimension getMinimumSize() {
       return fenster.getSize();
    }
    public Dimension getPreferredSize() {
       return bildanzeige.getSize();
    }
      
}
}

Gedacht ist es so, dass ich später in einen Menü eingebe, wieviele Bilder gleichzeitig horizontal eingelesen und gezeichnet werden. Was ja bei einem Bild schon der Fall ist..
 

Noar

Bekanntes Mitglied
Und was genau ist dein Problem?

Was meinst du denn mit "Unkontrolliert ein Verzeichnis auszulesen"? Du willst sicher, das alle Dateien mit einer bestimmten Endung angezeigt werden, oder?

Das macht doch das Beispiel von Andrey schon (in seinem Falle alle *.gif und *.jpg -Files).

Gut, in seinem Beispiel wählst du eine Datei aus einem Verzeichnis aus, und alle anderen Dateien des Verzeichnisses mit der entsprechenden Endung werden mitangezeigt, aber das brauchst du ja nur so umzubauen, das du kein File sondern einen Folder auswählen musst.

Naja, und wenn du nicht einfach ALLE Files, sondern eine Bestimmte Menge ausgeben willst, dann musst du halt die "for"-Schleife anpassen. Also bezogen auf das Beispiel von Andrey:

Code:
for(int i=0; i<files.length; i++){

sondern
Code:
int maxPics = 10; //sollte besser irgendwo von user abgefragt werden
for(int i=0; i<maxPics; i++){
 
G

Gast_Anfänger

Gast
Das Bsp. hatte ich schon, aber es soll ja eine Navigation durch das Verzeichnis geben und wenn ich das so mache, kann ich nicht weiter navigieren.

Das einzigste was ich möchte ist, dass mehr als ein Bild dargstellt wird. Was mit for richtig is, aber irgendwie stehe ich voll auf dem Schlauch und bekomme das Bsp. nicht in meinen Code integriert.
 

0x7F800000

Top Contributor
Gast_Anfänger hat gesagt.:
aber es soll ja eine Navigation durch das Verzeichnis geben und wenn ich das so mache, kann ich nicht weiter navigieren.
kannst du bitte sagen wie wo und wozu du irgendetwas navigieren willst, was passt dir denn am JFileChooser nicht? Was willst du denn überhaupt erreichen?

Das einzigste was ich möchte ist, dass mehr als ein Bild dargstellt wird. Was mit for richtig is, aber irgendwie stehe ich voll auf dem Schlauch und bekomme das Bsp. nicht in meinen Code integriert.
kA... wie man mehrere bilder lädt kann man imho meinem beispiel durchaus entnehmen, wie man bilder zeichnet hast du anscheinend auch mitbekommen, wenn ich mir das mit "CDildLeinwand" anschaue, du kannst also alles mögliche laden und alles mögliche zeichnen, wo ist also dein problem?
 
G

Gast_Anfänger

Gast
wenn ich mit JFileChooser mehrere Bilder auswähle, dann werden die übernommen und einzeln gezeichnet. Mit einem „vor“ und „zurück“ Button ist es möglich, zwischen den dargestellten Bildern zu wechseln. Ziel ist es allerdings, nicht nur ein Bild gleichzeitig darstellen zu können, sondern eine festgelegte Anzahl.

Mit dem Bsp. von „Noar“ kann man ja die Anzahl begrenzen, nur leider stehe ich etwas auf dem Schlauch und kann immer nur ein Bild darstellen.

Bsp.

gewählte Bilder mit JFileChooser: B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11

derzeit geht es so
Anzeige1 B1
Anzeige2 B2
Anzeige3 B3
Anzeige4 B4


richtig
Anzeige1 B1 B2 B3
Anzeige2 B4 B5 B6
Anzeige3 B7 B8 B9
Anzeige4 B10 B11 B1
 

0x7F800000

Top Contributor
1) was meinst du genau mit "Anzeige"?
2) Du weißt doch wie du ein bild zeichnest... was hindert dich denn genau daran diesen vorgang in einer 3-er for-schleife zu wiederholen?
 

anfänger15

Bekanntes Mitglied
Du kannst dir noch ein array mit CBildLeinwand Objekten erstellen und je nachdem wie viele Bilder du auf einmal anzeigen willst so viele CBildLeinwand Objekte erstellst du auch im array. Am Schluss solltest du z.B. bei 4 dann 4 CBildLeinwand Objekte haben die angezeigt werden und in denen Bilder dargestellt werden. wenn man dann auf weiter klickt müssen eben die nächsten 4 Bilder geladen werden und in den 4 verschiedenen CBildLeinwand Objekten dargestellt werden.

Dabei würde ich aber beachten, dass wenn du mehrere Bilder mit hoher qualität gleichzeitig im Speicher hälst sehr schnell ein Speicherplatzproblem bekommst, so wie es mir damals auch ging. Um dies zu umgehen kannst du ein Bild laden, dieses rendern und dann nur das gerenderte Bild im speicher behalten, dann das nächste laden.
 
G

Gast_Anfänger

Gast
genau und da is mein Problem, ich weiß nicht wie :) habe es mit einer for Schleife versucht, aber leider nicht hin bekommen :(
 

anfänger15

Bekanntes Mitglied
Nicht schön, aber selten :D

Code:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.IIOImage;
import javax.swing.text.*;
import java.awt.print.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import java.awt.Insets;
import java.io.File;
import javax.swing.JFileChooser;
import java.awt.Graphics2D;
import java.lang.Integer;
import java.awt.Dimension;
import javax.swing.JColorChooser;

import java.awt.*;
import java.awt.Color;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;


public class Browser extends JFrame {
static Browser fenster;
Image[] bild;

int index = 0;
int x_pos,y_pos;
String name;
CBildLeinwand[] bildanzeige;
File[] dateiweg;

private JFileChooser chooser;

  int bild_x1,bild_y1;        // die aktuelle Begrenzung
  int bild_x2,bild_y2;        // des Bildes
  int bildBreite,bildHoehe;
  int anzahl = 3;

class ActionLauscher implements ActionListener {
   public void actionPerformed(ActionEvent e) {
   String Label;

   Label = e.getActionCommand();

   if (Label.equals("Objektbrowser")){
     laden();
   
}

   if (Label.equals("beenden"))
     System.exit(0);

if(Label.equals("weiter")){

  if(index > dateiweg.length-1) {
         index = 0;
          }
for(int i=0; i<bild.length;i++){	
ImageIcon tmp = new ImageIcon(dateiweg[index].getAbsolutePath());
bild[i] = tmp.getImage();
bildanzeige[i].setImage(bild[i]);
index++;
}
   }
   

if(Label.equals("zurück")){

  if(index < 0) {
         index = dateiweg.length-1;
         }
         for(int i=0; i<bild.length;i++){
ImageIcon tmp = new ImageIcon(dateiweg[index].getAbsolutePath());
bild[i] = tmp.getImage();
bildanzeige[i].setImage(bild[i]);
index--;
}
}
   repaint();
   }
}

Browser (String titel) {
  super(titel);

x_pos = y_pos ;
bild_x1 = bild_x2 = bild_y1 = bild_y2;

name = null;
bild = null;

setLayout(new BorderLayout());

bildanzeige  = new CBildLeinwand[anzahl];
bild = new Image[anzahl];
for(int i=0; i<bildanzeige.length;i++){
bildanzeige[i] = new CBildLeinwand();	
}

for(CBildLeinwand d : bildanzeige){	
d.setSize(300,300);
}
JPanel addBild = new JPanel();
addBild.setSize(1024,700);

for(CBildLeinwand d : bildanzeige){	
addBild.add(d);
}

add(addBild,BorderLayout.NORTH);
for(CBildLeinwand d : bildanzeige){	
d.setBackground(Color.white);
}

JPanel Button = new JPanel();
JButton weiter = new JButton("weiter");
JButton zurück = new JButton("zurück");

Button.add(zurück);
Button.add(weiter);
add(Button,BorderLayout.SOUTH);
weiter.addActionListener(new ActionLauscher());
zurück.addActionListener(new ActionLauscher());

JScrollPane listenScrollPane = new javax.swing.JScrollPane();
listenScrollPane.setViewportView(addBild);
add(listenScrollPane);   


JMenuBar menuleiste = new JMenuBar();
setJMenuBar(menuleiste);

JMenu menu = new JMenu("Datei"); //menu erstellen

JMenuItem laden = new JMenuItem("Objektbrowser"); //Menubutton laden
laden.addActionListener(new ActionLauscher());


JMenuItem beenden = new JMenuItem("beenden");
beenden.addActionListener(new ActionLauscher());
menu.add(laden);

menu.add(beenden);
menuleiste.add(menu);

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

}
public void laden(){

  chooser = new JFileChooser();
  chooser.setMultiSelectionEnabled(true);
  if (chooser.showOpenDialog(this) ==
                                JFileChooser.APPROVE_OPTION){
                                   
dateiweg = chooser.getSelectedFiles();
if (dateiweg == null) {
return;
}
if(dateiweg.length>0)
   name = dateiweg[0].getName();

}
for(int i=0; i<bild.length;i++){	
ImageIcon tmp = new ImageIcon(dateiweg[index].getAbsolutePath());
bild[i] = tmp.getImage();
bildanzeige[i].setImage(bild[i]);
index++;
}
     for(int i=0; i<bildanzeige.length;i++){
     	
     
bildBreite = bild[i].getWidth(bildanzeige[i]);
bildHoehe = bild[i].getHeight(bildanzeige[i]);


bild_x1 = x_pos;
bild_y1 = y_pos;
bild_x2 = bild_x1 + bildBreite;
bild_y2 = bild_y1 + bildHoehe;
bildanzeige[i].setSize(bildBreite,bildHoehe);
bildanzeige[i].repaint();
}
}

public static void main(String[] args){
fenster = new Browser("Bildbetrachter");
fenster.setSize(1024,300);

fenster.pack();
fenster.setLocation(30,50);
fenster.setVisible(true);
}

class CBildLeinwand extends JPanel {
    Image bild;
   
    // Panel neu zeichnen
    public void paintComponent(Graphics g) {
      super.paintComponent(g);

    // Falls ein Bild geladen ist, das Bild anzeigen
    if(bild != null)
        g.drawImage(bild,x_pos,y_pos,this);
    }
    public void setImage(Image bild){
    this.bild = bild;	
    }
   
    public Dimension getMinimumSize() {
       return fenster.getSize();
    }
    public Dimension getPreferredSize() {
       return this.getSize();
    }
     
}
}


Nun hast du noch das Problem, dass wenn die Bilder unterschiedlich groß sind werden sie auch unterschiedlich groß dargestellt. Um dies zu verhindern musst du die Bilder auch eine Einheitliche große skalieren. Du sollst ja auch noch was zu tun haben. :D
 
G

Gast_Anfänger

Gast
oh, ich danke dir für die Hilfe, is genau das was mir gefehlt hat, mit der Größe habe ich auch schon gelösen können :)

manchmal hängt man irgendwie aufm Schlau und kommt einfach nicht aufn Nenner

:) danke
 
G

Gast_Anfänger

Gast
oh, ich danke dir für die Hilfe, is genau das was mir gefehlt hat, mit der Größe habe ich auch schon gelösen können :)

manchmal hängt man irgendwie aufm Schlau und kommt einfach nicht aufn Nenner

:) danke
 
G

Gast_Anfänger

Gast
oh, ich danke dir für die Hilfe, is genau das was mir gefehlt hat, mit der Größe habe ich auch schon gelösen können :)

manchmal hängt man irgendwie aufm Schlau und kommt einfach nicht aufn Nenner

:) danke
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Erste Schritte Bildbetrachter Java Basics - Anfänger-Themen 7
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
Poppigescorn Arrayliste Mittels Scanner erweitern Java Basics - Anfänger-Themen 6
J GroupLayout zur Laufzeit erweitern Java Basics - Anfänger-Themen 1
B Array bei jeder Eingabe um eins erweitern Java Basics - Anfänger-Themen 3
JD_1998 Vorgegebene Methode erweitern um Hex -> Dezimal umzuwandeln Java Basics - Anfänger-Themen 1
V Array aus Klasse um vererbte Elemente erweitern Java Basics - Anfänger-Themen 3
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
bensdt Klasse erweitern um eine Methode "void decrement()" Java Basics - Anfänger-Themen 5
M Ein Programm erweitern, wie? Java Basics - Anfänger-Themen 3
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
S Array Java erweitern Java Basics - Anfänger-Themen 27
I Vererbung Polygon erweitern ? Java Basics - Anfänger-Themen 4
zhermann String erweitern Java Basics - Anfänger-Themen 4
L Java Kenntnisse erweitern... Java Basics - Anfänger-Themen 10
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
M Classpath Befehl zum Kompilieren um die Option classpath erweitern. Java Basics - Anfänger-Themen 5
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
D Datentypen 2 d array erweitern und ins negative gehen. Java Basics - Anfänger-Themen 9
J Listenimplementierung - Wie erweitern? Java Basics - Anfänger-Themen 1
F Erste Schritte If Bedingung in Schleife dynamisch erweitern Java Basics - Anfänger-Themen 4
V Dreidimensionales int Array erweitern/verkleinern Java Basics - Anfänger-Themen 4
A Properties erweitern Java Basics - Anfänger-Themen 2
H Klasse erweitern Java Basics - Anfänger-Themen 20
M Array erweitern ohne Stringbuilder Java Basics - Anfänger-Themen 6
U JFrame durch ActionListener erweitern Java Basics - Anfänger-Themen 4
HoloYoitsu args-Parameter durchschleifen (Schnittstelle erweitern?) Java Basics - Anfänger-Themen 27
R Polygon erweitern Java Basics - Anfänger-Themen 10
T Vererbung, Konstruktor erweitern Java Basics - Anfänger-Themen 4
E Input/Output Datei immer weiter erweitern Java Basics - Anfänger-Themen 4
L Array um ein Feld erweitern Java Basics - Anfänger-Themen 13
S table erweitern Java Basics - Anfänger-Themen 3
M Array in Methode erweitern und zurückgeben Java Basics - Anfänger-Themen 7
C ImageIcon erweitern Java Basics - Anfänger-Themen 6
L Array erweitern per Methode Java Basics - Anfänger-Themen 5
C OOP Externe Klasse erweitern (ohne Vererbung!!) Java Basics - Anfänger-Themen 8
E Objekt entweder erstellen oder erweitern Java Basics - Anfänger-Themen 4
C xml datei erweitern Java Basics - Anfänger-Themen 3
S Teiler ermittlen - Array erweitern? Java Basics - Anfänger-Themen 14
B EnumSet erweitern ... Java Basics - Anfänger-Themen 25
T array erweitern/flexible ohne collections usw. Java Basics - Anfänger-Themen 3
J Arrays erweitern - Performance vs Speicherverbrauch Java Basics - Anfänger-Themen 6
B Textdateien erweitern Java Basics - Anfänger-Themen 7
V Warum? Klasse erweitern und ausgeben Java Basics - Anfänger-Themen 3
S Welche Klasse erweitern? Java Basics - Anfänger-Themen 4
G JComboBox um eine Methode erweitern Java Basics - Anfänger-Themen 2
L String erweitern. Java Basics - Anfänger-Themen 2
H 2DArray manuell dynamisch erweitern Java Basics - Anfänger-Themen 7
K Objekte/Klassen erweitern ~ Javascript Prototyp Java Basics - Anfänger-Themen 5
D Heap erweitern Java Basics - Anfänger-Themen 3
P Fenstergröße per Buttonklick erweitern? Java Basics - Anfänger-Themen 4
A Queue erweitern Java Basics - Anfänger-Themen 13
A classpath zur Laufzeit erweitern Java Basics - Anfänger-Themen 4
T Objekt erweitern Java Basics - Anfänger-Themen 3
G Feld bzw. Arrays erweitern oder zusammenfügen Java Basics - Anfänger-Themen 4
C fenster erweitern durch button Java Basics - Anfänger-Themen 3
M JList Datenstring erweitern und JList aktualisieren Java Basics - Anfänger-Themen 5
G JToolbar dynamisch erweitern Java Basics - Anfänger-Themen 8
G Menüeinträge dynamisch erweitern Java Basics - Anfänger-Themen 2
J Erweitern eines Tree-Pfades? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben