LayoutManager Komponent vergrößert sich beim kleiner Ziehen?

Pumpkin

Mitglied
Hallo,

ich habe ein JPanel, in welches ich beliebig viele Komponenten einfügen möchte. Wenn nur eine Komponente da ist, soll dieser das ganze Panel ausfüllen. Wenn mehrere hinzukommen, sollen sie sich den Platz teilen, wobei jede gleich viel bekommen soll. Wenn so viele Komponenten im Panel sind, dass eine Mindestgröße unterschritten wird, soll eine Scrollbar auftauchen und jede Komponente soll ihre Mindestgröße haben.
Gemacht habe ich das so:

übergeordnetes Panel:
Java:
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = nummerDerKomponente;
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 0.5; // hat mein Kollege gemacht, lustigerweise wird dann die ganze Breite genommen (was auch gewollt ist)
constraints.anchor = GridBagConstraints.NORTH;
constraints.weighty = 1.0;

in allen Komponenten:
Java:
setMinimumSize(new Dimension(50, mindestgroesse));
setPreferredSize(new Dimension(50, standardgroesse));

Das Verhalten ist folgendermaßen:
-Wenn die erste Komponente hinzugefügt wird, füllt diese das ganze Panel aus (wie gewünscht). Wenn nun per Maus gezogen wird und die Größe der Komponente verkleinert werden soll, wird diese stattdessen größer (nicht gewünscht).
-Wenn Komponenten hinzugefügt werden, teilen sie sich das Panel zu gleichen Teilen (gewünscht). Beim Verkleinern tritt das gleiche Verhalten auf (nicht gewünscht).

Woran liegt das?

Danke
 

Pumpkin

Mitglied
Habe ich auch überlegt, aber ich füge die Komponenten in das Panel immer nacheinander ein und wenn ich das richtig sehe, muss ich für das Gridlayout die Anzahl der Zellen vorher bereits festlegen.
Wäre es denn eine Möglichkeit, ein Layout zu erstellen und jedesmal, wenn eine Komponente hinzu kommt oder entfernt wird, das alte Layout zu überschreiben und ein neues mit der entsprechenden Größe einzufügen?
 

Michael...

Top Contributor
Habe ich auch überlegt, aber ich füge die Komponenten in das Panel immer nacheinander ein und wenn ich das richtig sehe, muss ich für das Gridlayout die Anzahl der Zellen vorher bereits festlegen.
Nicht unbedingt:
Java:
	JFrame frame = new JFrame();
	frame.getContentPane().setLayout(new GridLayout(0, 3));
	for (int i=0; i<7; i++)
		frame.getContentPane().add(new JLabel("Label " + i));
	frame.setBounds(0, 0, 200, 200);
	frame.setVisible(true);
 

Michael...

Top Contributor
Kannst da mal ein kompilierbares Bsp posten?
Ich denke, das könnte mit
Code:
setMinimumSize()
zusammenhängen.
 

Pumpkin

Mitglied
So, ich hab mal Teile des Quelltextes extrahiert, sodass es ungefähr so aussieht wie bei mir. Das Verhalten ist übriegns das gleiche. Der Quelltext ist so groß, weil die Klasse benötigt wird, um die Resize-Leiste zu benutzen, die nötig ist.

Java:
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;

public class LayoutTest
{

    public static void main(String[] args)
    {
        JFrame f = new JFrame("This is a test");
        f.setSize(1000, 1000);
        Container content = f.getContentPane();

        JPanel panel = new JPanel();

        content.add(panel);

        panel.setLayout( new GridBagLayout());
        panel.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.fill = GridBagConstraints.BOTH;
        constraints.weightx = 1.0; //Traumhaft!
        constraints.anchor = GridBagConstraints.NORTH;
        constraints.weighty = 1.0;


        panel.add(newPanel(), constraints);

        constraints.gridy = 1;
        panel.add(newPanel(), constraints);

        f.setVisible(true);
    }

    public static JPanel newPanel()
    {
        JPanel panel = new JPanel();
        panel.setLayout( new BorderLayout());
        panel.setPreferredSize(new Dimension(50, 150));
        panel.setMaximumSize(new Dimension(1000, 1000));

        JPanel centerPanel = new JPanel();
        centerPanel.add(new JButton("Button"));

        DragBar resizeDragger = new DragBar(panel);

        panel.add(centerPanel, BorderLayout.CENTER);
        panel.add(resizeDragger, BorderLayout.SOUTH);

        return panel;
    }
}



class DragBar extends JComponent
        implements MouseListener,
                   MouseMotionListener
{
   private Point pointPressed;
   private Point pointReleased;

   private JPanel panel;

   /**
    * Create new DragBar and add to a panel.
    *
    * @param panel  The panel that should extend the drag bar to resize.
    */
   public DragBar(JPanel panel)
   {
     this.panel = panel;

     setBackground(Color.BLACK);
     setOpaque(true);
     setUI(new ComponentUI() {});
     setPreferredSize(new Dimension(5,5));

     addMouseListener(this);
     addMouseMotionListener(this);
   }

   @Override
   public void mousePressed(MouseEvent e)
   {
     pointPressed = e.getLocationOnScreen();
     updateCursor(true);
   }

   private void updateCursor(boolean on)
   {
     if (on) {
         setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));
     } else {
       setCursor(null);
     }
   }
    @Override
    public void mouseReleased(MouseEvent e)
    {
        pointReleased = e.getLocationOnScreen();

        int deltaY = pointReleased.y - pointPressed.y;

        Dimension size = panel.getSize();

        size.height += deltaY;

        Dimension minSize = panel.getMinimumSize();
        if (minSize != null) {
            if (size.width < minSize.width) {
                size.width = minSize.width;
            }
            if (size.height < minSize.height) {
                size.height = minSize.height;
            }
        }

        panel.setPreferredSize(new Dimension(panel.getWidth(), size.height));

        ((JPanel) panel.getParent()).revalidate();

        pointPressed = null;
        pointReleased = null;
   }

    @Override
    public void mouseEntered(MouseEvent e)
    {
        updateCursor(true);
    }

    @Override
    public void mouseDragged(MouseEvent e)
    {
        mouseReleased(e);
        pointPressed = e.getLocationOnScreen();
    }

    @Override
    public void mouseClicked(MouseEvent e)
    {
    }

    @Override
    public void mouseExited(MouseEvent e)
    {
    }

    @Override
    public void mouseMoved(MouseEvent e)
    {
    }

}
 

Michael...

Top Contributor
Kann das leider so nicht direkt beim mir ausführen, da ich kein JDK 1.6 auf meinem Rechner habe.
Aber wenn ich das richtig sehe, ist das GridLayout für den Vorhaben nicht unbedingt geeignet.
Da macht es eventuell sogar Sinn einen eigenen LayoutManager zu schreiben.

Nach welchen Kriterien sollen denn bei einer Änderung der Containergröße die Komponentengrößen angepasset werden? Soll das "Höhen"verhältnis bei behalten werden?
 

Pumpkin

Mitglied
Also es gibt das Panel in das die Komponenten (K) eingefügt werden und die Größe der K soll sich nach folgenden Punkten richten (Die Breite der K ist immer gleich, nur die Höhe ist relevant):

-Jede K hat eine Mindestgröße
-Wenn das Panel leer ist und die erste K hinzugefügt wird, soll sie das ganze Panel ausfüllen
-Wenn eine weitere K hinzugefügt wird, sollen sich alle das Panel teilen. Wenn der Platz für eine K kleiner ist als die Mindestgröße, soll ein Scrollbalken eingeführt werden und jede K hat ihre Mindestgröße.
-Die Größe der K soll verändert werden können über die Resize-Leiste, der Spielraum soll hier die Mindest- und Maximilgröße sein.
-Wenn eine K verkleinert worden ist und eine zweite hinzugefügt wird, soll sie den restlichen freien Platz des Panels einnehmen.
 

Michael...

Top Contributor
-Wenn das Panel leer ist und die erste K hinzugefügt wird, soll sie das ganze Panel ausfüllen
Das heisst der LayoutManager muss sich nicht an die Maximalgröße eine Komponente halten?
Kann diese Komponente dann über die Resizeleiste verkleinert werden?
Bzw. Kann es grundsätzlich vorkommen, dass das Containerpanel manchmal nicht komplett gefüllt ist?
-Wenn eine weitere K hinzugefügt wird, sollen sich alle das Panel teilen. Wenn der Platz für eine K kleiner ist als die Mindestgröße, soll ein Scrollbalken eingeführt werden und jede K hat ihre Mindestgröße.
Heisst: Wenn der sichtbare Ausschnitt der ScrollPane nicht mehr ausreicht um alle Komponenten in deren Mindestgröße darzustellen.
-Die Größe der K soll verändert werden können über die Resize-Leiste, der Spielraum soll hier die Mindest- und Maximilgröße sein.
Die anderen Komponenten behalten dabei ihre Größe bei?
-Wenn eine K verkleinert worden ist und eine zweite hinzugefügt wird, soll sie den restlichen freien Platz des Panels einnehmen.
Ist das die Antwort auf meine 2. und 3. Frage? (z.B. Panel ist leer. K1 wird eingefügt. K1 nimmt nun das komplette Panel ein. User verkleinert K1. K2 wird eingefügt. K1 bleibt in der Größe unverändert. K2 nimmt den noch freien Raum ein. Was ist wenn der Raum für K2 kleiner als dessen Mindestgröße ist?)
Ausserdem muss sich die Komponente merken, ob sie manuell in Ihrer Größe verändert wurde.

Wenn ich das so richtig überblicke, wird man da wohl um einen eigenen LayoutManager nicht herumkommen.
 

Pumpkin

Mitglied
So,

ich habe mir tatsächlich meinen eigenen Layoutmanager geschrieben und bin soweit auch zufrieden, das Verhalten ist so, wie ich es mir gewünscht habe.
Ein Problem habe ich dennoch:
Wenn eine Komponente sagen wir 800px von 1000px belegt und eine neue mit 300px hinzugefügt wird, werden 1100px von 1000px belegt.

Folgendermaßen wird die Position der Komponenten festgelegt:
Java:
for (Component com : parent.getComponents())
{
    com.setBounds(0, sizeAdded, width, heights.get(com));
    sizeAdded += heights.get(com);
}

Im o.g. Fall soll nun nach Hinzufügen der 300px-Komponente der Scrollbalken erscheinen, tut er aber nicht. Testweise lasse ich mir folgendes Ausgeben:

Java:
System.out.println(sizeAdded+" "+parent.getSize().getHeight());

Der Container hat immernoch die Größe 1000px, die Summe der Komponenten hat 1100px. Wenn ich über meine Resize-Leiste die Größe einzelner Komponenten verändere, ändern sich die Größen von Container und Komponente mit, jedoch ist die Gesamtgrößen der Komponenten nie gleich der Größe des Containers, der Container ist immer kleiner.
Ich habe folgendes versucht ganz am Ende von LayoutContainer() aufzurufen:

Java:
parent.setSize(width, sizeAdded);

Damit wollte ich, dass der Container immer an die Größe der Komponenten angepasst wird. Es entsteht aber eine Endlosschleife, weil die Methode setSize anscheinend nochmal LayoutContainer() aufruft.

Was kann ich tun?
 

Michael...

Top Contributor
Welche Größe gibt's Du denn bei der
Code:
public Dimension preferredLayoutSize(Container parent)
des LayoutManagers zurück? Wenn hier die 1100 als bevorzugte Höhe angegeben werden, dann sollte die ScrollPane den Scrollbalken anzeigen. (glaube ich mich zu erinnern)
 

Pumpkin

Mitglied
Danke für den Hinweis, das war auch falsch. Der Ursprungsfehler war aber, dass ich kein
Code:
((JPanel) parent).revalidate();
gemacht habe.

Nun stehe ich aber vor dem nächsten Problem:
Ich möchte, dass man die Komponenten per Drag&Drop verschieben kann. Dazu will ich, dass die Komponente, die gerade verschoben wird vom Benutzer, immer oben ist, die anderen immer drunter.

Ich hatte vorher folgendes:

Java:
_componentPanel = new JPanel(MyOwnLayoutManager());
_scrollPane = new JScrollPane(_componentPanel);

Dies habe ich so abgeändert, dass ich ein Zwischenpanel habe, wo ich dann die Komponente zeichnen wollte, die gerade verschoben wird:

Java:
_componentPanel = new JPanel(MyOwnLayoutManager());
_movingPanel = new JPanel();
_movingPanel.add(_componentPanel);
_scrollPane = new JScrollPane(_movingPanel);

Nur irgendwie klappt es nicht so wie erhofft, es werden dann nämlich keine Komponenten mehr gezeichnet.
 

Pumpkin

Mitglied
Ok war nicht schwer, man kann es auch einfach mit
Code:
parent.setComponentZOrder(_componentBeingMoved, 0);
machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
P Einen Komponent zweimal zu einem Panel hinzufügen? AWT, Swing, JavaFX & SWT 18
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
N JPanel vergrößert sich bei zu großem Bild AWT, Swing, JavaFX & SWT 5
A Swing JFrame vergrößert sich immer bei setText() eines Labels AWT, Swing, JavaFX & SWT 3
aze JTable automatisch vergrößern wenn das zugehörige JFrame vergrößert wird AWT, Swing, JavaFX & SWT 13
R JPanel verkleinert sich, wenn man das Fenster vergrößert AWT, Swing, JavaFX & SWT 7
D JPanel, welches sich per Button vergrößert(in GridBagLayout) AWT, Swing, JavaFX & SWT 2
Juelin Javafx hängt sich auf AWT, Swing, JavaFX & SWT 31
I JavaFX Programmcode pausieren gestaltet sich als schwierig AWT, Swing, JavaFX & SWT 7
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
S e(fx)clipse erscheint nicht im Marketplace, lässt sich nicht installieren AWT, Swing, JavaFX & SWT 16
A TableView updatet sich nicht AWT, Swing, JavaFX & SWT 3
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
J JOptionPane ruft sich selbst immer wieder neu auf AWT, Swing, JavaFX & SWT 3
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
R JOptionPane schließt sich nicht wieder AWT, Swing, JavaFX & SWT 2
R Textfield lässt sich nicht positionieren AWT, Swing, JavaFX & SWT 1
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
O showConfirmDialog öffnet sich nicht AWT, Swing, JavaFX & SWT 3
K JavaFX Fenstergröße ändert sich (Gluon - SceneBuilder) AWT, Swing, JavaFX & SWT 23
S JavaFX Scene öffnet sich nicht AWT, Swing, JavaFX & SWT 3
C Bilder so einbinden, dass sie sich ändern AWT, Swing, JavaFX & SWT 6
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
J ChangeListener verhält sich komisch AWT, Swing, JavaFX & SWT 14
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
P Gui lässt sich nicht starten AWT, Swing, JavaFX & SWT 10
B JavaFX setOnMousePressed() - verhält sich wie setOnMouseClicked()? AWT, Swing, JavaFX & SWT 6
R JavaFX lässt sich nicht in Eclipse einbinden AWT, Swing, JavaFX & SWT 4
J BackgroundJPanel passt sich dem JFrame nicht an AWT, Swing, JavaFX & SWT 7
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
M 2D-Grafik Spielfigur bewegt sich nicht AWT, Swing, JavaFX & SWT 6
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
T .jar-Datei lässt sich unflexibler ausführen als über die IDE AWT, Swing, JavaFX & SWT 11
K JavFX: VBox.setVGrow stell sich quer AWT, Swing, JavaFX & SWT 2
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
S Swing Bedienelemente ordnen sich automatisch neu an AWT, Swing, JavaFX & SWT 2
B Hauptfenster öffnet sich mehrmals AWT, Swing, JavaFX & SWT 9
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
E Java FX ProgressIndicator dreht sich nicht AWT, Swing, JavaFX & SWT 8
P Swing JFrame minimiert sich bei Doppelklick auf die Titel-Leiste AWT, Swing, JavaFX & SWT 16
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
D JavaFX Label lässt sich nicht mehrmals färben AWT, Swing, JavaFX & SWT 7
Prafy Sich ändernde Farbverläufe erstellen AWT, Swing, JavaFX & SWT 4
D JavaFX Anwendung hängt sich permanent auf AWT, Swing, JavaFX & SWT 6
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
T Swing Programm hängt sich auf! AWT, Swing, JavaFX & SWT 23
C LayoutManager Bei verkleinern des Fensters, verschieben sich JPanels übereinander. AWT, Swing, JavaFX & SWT 7
J Lohnt sich FX? AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX ProgressIndicator dreht sich nicht AWT, Swing, JavaFX & SWT 2
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
Tom299 JavaFX Default-Cursor läßt sich nicht immer "aktivieren" AWT, Swing, JavaFX & SWT 3
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Server stellt sich hin AWT, Swing, JavaFX & SWT 13
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
J Programm hängt sich bei Log In auf AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
ToBJo JavaFX TreeView zerstört sich selbst AWT, Swing, JavaFX & SWT 1
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
B JavaFX Problem bei Kamera / Group, gesamte Scene bewegt sich mit AWT, Swing, JavaFX & SWT 0
M JXTreeTable: Spaltengröße läßt sich nicht mehr festlegen AWT, Swing, JavaFX & SWT 0
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
W JTextfield - Wert lässt sich nicht setzen AWT, Swing, JavaFX & SWT 3
H 2D-Grafik BufferStrategy zieht spur hinter sich her AWT, Swing, JavaFX & SWT 3
T SWT SWTBot Test: Dialog soll sich öffnen,wenn button gedrückt AWT, Swing, JavaFX & SWT 3
kaoZ Swing JFrame lässt sich nicht über dispose() abbauen AWT, Swing, JavaFX & SWT 0
D 2D-Grafik Rechteck befindet sich unter dem Rahmen des JFrame. AWT, Swing, JavaFX & SWT 1
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
B Swing focusGained öffnet sich zwei mal AWT, Swing, JavaFX & SWT 3
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
A Panel lässt sich nicht bewegen AWT, Swing, JavaFX & SWT 2
U ToolTip Größenänderung, passt sich erst beim zweiten Mal an AWT, Swing, JavaFX & SWT 6
H Java3D, ViewP Translattform soll sich nach einerformgroup richten. AWT, Swing, JavaFX & SWT 5
R JPanel-Größe verändert sich nicht. Warum? AWT, Swing, JavaFX & SWT 5
R Swing getContentPane maximiert sich nicht mit, wenn man das JFrame maxmiert AWT, Swing, JavaFX & SWT 8
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
G 2D-Slider bzw. eine graphische Auswahlkomponente die sich so verhält AWT, Swing, JavaFX & SWT 6
F Grafik hängt sich auf AWT, Swing, JavaFX & SWT 20
M JavaFX WebView lässt sich nur einmal öffnen AWT, Swing, JavaFX & SWT 2
B Komponenten in Fenster verdrängen sich untereinander AWT, Swing, JavaFX & SWT 6
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
J AWT choice mit viel Auswahl aktualisiert sich nicht korrekt beim scrollen?! AWT, Swing, JavaFX & SWT 3
A Vier gewinnt: GUI aktualisiert sich nicht AWT, Swing, JavaFX & SWT 12
T Java Swing Oberfläche aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben