Swing JBorderLayout - Abstand

Status
Nicht offen für weitere Antworten.

Chimi

Mitglied
Guten Tag. Ich habe mal zu Testzwecken folgende kleine Oberfläche geschrieben:

[HIGHLIGHT="Java"]import javax.swing.*;
import java.awt.*;

public class Anmeldung extends JFrame
{
private JTextField textfeld_name = new JTextField();
private JPasswordField textfeld_passwort = new JPasswordField();

public Anmeldung(String title)
{
super(title);

setLayout(new BorderLayout());

JPanel beschreibung = new JPanel(new GridLayout(2,1,5,5));
beschreibung.add(new JLabel("Name: "));
beschreibung.add(new JLabel("Passwort: "));
add(beschreibung, BorderLayout.WEST);

JPanel eingabe = new JPanel(new GridLayout(2,1,5,5));
eingabe.add(textfeld_name);
eingabe.add(textfeld_passwort);
add(eingabe, BorderLayout.CENTER);

JPanel unten = new JPanel(new FlowLayout(FlowLayout.CENTER));
add(unten, BorderLayout.SOUTH);
JPanel knoepfe = new JPanel(new GridLayout(1,2,5,5));
knoepfe.add(new JButton("Anmelden"));
knoepfe.add(new JButton("Abbrechen"));
unten.add(knoepfe);

setSize(400, 150);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}

public static void main(String[] args)
{
Anmeldung a = new Anmeldung("Anmeldung");
}
}[/HIGHLIGHT]

Wie kann ich hier einen Abstand zum Fensterrand hinbekommen? Also Links neben den JLabels und Rechts neben den Textfeldern? setLayout(new BorderLayout(10,10)) setzt ja nur den Abstand der Zellen untereinander, aber wie mach ich das um das Borderlayout herum ein Rahmen entsteht?

LG Chimi
 
Zuletzt bearbeitet von einem Moderator:
such mal nach irgendwas mit padding 🙂

Edit: Oder setz einfach mal en BorderLayout um das BorderLayout. Also dem äußeren dann das innere (mit den Daten) mit CENTER übergeben... Und dann kannst ja beim äußeren sagen new BorderLayout(10, 10); Sollte denke ich funktionieren. Habs aba ned probiert!
 
Zuletzt bearbeitet von einem Moderator:
ich weiss nich ob man das bei einem JFrame machen sollte, bzw ob das zum erfolg führt ..

[HIGHLIGHT="Java"]
getInsets() = new Insets(...);
[/HIGHLIGHT]
damit bekommst die Insets der Border sofern vorhanden.
Ich vermute mal JFrame hat meist ne Border, sowie JPanel implizit wohl auch.
Daher würde ich eher dazu tendieren ... auf das ContenPane des JFrames nur 1 Panel zu setzen, das mit BorderLayout auszustatten und alle deine Komponenten da rauf zu legen. Dann kannst du getInsets auf dem Panel aufrufen und überschreiben.
 
beschreibung.setBorder(new EmptyBorder(5, 5, 0, 0));
eingabe.setBorder(new EmptyBorder(5, 0, 0, 5));

Danke, das war die Lösung. Ich hatte vorhin schon etwas ausprobiert mit dem EmptyBorder, hatte aber nicht wirklich geklappt. Muss ich wohl was falsch gemacht haben.

Mein bisheriger Quellcode:

[HIGHLIGHT="Java"]import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;

public class Anmeldung extends JFrame
{
private JTextField textfeld_name = new JTextField();
private JPasswordField textfeld_passwort = new JPasswordField();

public Anmeldung(String title)
{
super(title);

setLayout(new BorderLayout());

JPanel beschreibung = new JPanel(new GridLayout(2,1,5,5));
beschreibung.setBorder(new EmptyBorder(10,10,10,10));
beschreibung.add(new JLabel("Name: "));
beschreibung.add(new JLabel("Passwort: "));
add(beschreibung, BorderLayout.WEST);

JPanel eingabe = new JPanel(new GridLayout(2,1,5,5));
eingabe.setBorder(new EmptyBorder(10,10,10,10));
eingabe.add(textfeld_name);
eingabe.add(textfeld_passwort);
add(eingabe, BorderLayout.CENTER);

JPanel unten = new JPanel(new FlowLayout(FlowLayout.CENTER));
add(unten, BorderLayout.SOUTH);
JPanel knoepfe = new JPanel(new GridLayout(1,2,5,5));
knoepfe.add(new JButton("Anmelden"));
knoepfe.add(new JButton("Abbrechen"));
unten.add(knoepfe);

setSize(400, 150);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}

public static void main(String[] args)
{
Anmeldung a = new Anmeldung("Anmeldung");
}
}[/HIGHLIGHT]

Ich hab aber noch eine Frage bezüglich der Textfelder. Wenn ich das Fenster Maximiere, dann vergrößern sich meine Textfelder natürlich auch. Das liegt an dem JGridLayout. Gibt es eine Möglichkeit die natürliche Größte der Textfelder beizubehalten, evtl mit einer Schachtelung von Layouts wie ich es unten bei den JButtons gemacht habe?

lg
 
Zuletzt bearbeitet von einem Moderator:
Wenn ich das Fenster Maximiere, dann vergrößern sich meine Textfelder natürlich auch. Das liegt an dem JGridLayout. Gibt es eine Möglichkeit die natürliche Größte der Textfelder beizubehalten, evtl mit einer Schachtelung von Layouts wie ich es unten bei den JButtons gemacht habe?
Sowas kann man machen, die Frage ist nur, wie sich der ungenutzte Platz verteilen soll. Alternativ können wir auch die Grösse des Frames einfrieren:
setResizable(false);
 
Guten Tag.

setResizable(false) ist mir bekannt. Aber an was ich gedacht habe ist das man das Fenster vergrößern oder Maximieren kann und die Textfelder nur in die Breite mit wachsen.Die natürliche Höhe soll beibehalten werden. Der freie Platz der sich ergibt kann ruhig frei bleiben und die Textfelder können auch in der horizontalen ruhig auseinander gezogen werden.
 
an was ich gedacht habe ist das man das Fenster vergrößern oder Maximieren kann und die Textfelder nur in die Breite mit wachsen.Die natürliche Höhe soll beibehalten werden.
Eine Möglichkeit wäre, GridLayout einfach durch RelativeLayout zu ersetzen:
Java:
/*
 * Anmeldung2.java
 *
 * benutzt die Klasse RelativeLayout, die wir hier finden:
 * http://tips4java.wordpress.com/2008/11/02/relative-layout/
 */

import javax.swing.*;
import java.awt.*;
import relativelayout.RelativeLayout;

public class Anmeldung2 extends JFrame {

    private JTextField textfeld_name = new JTextField();
    private JPasswordField textfeld_passwort = new JPasswordField();

    public Anmeldung2(String title) {
        super(title);

        setLayout(new BorderLayout());
        RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS, 5);
        rl.setFill(true);
        JPanel beschreibung = new JPanel(rl);
        beschreibung.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        beschreibung.add(new JLabel("Name: "));
        beschreibung.add(new JLabel("Passwort: "));
        add(beschreibung, BorderLayout.WEST);

        JPanel eingabe = new JPanel(rl);
        eingabe.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        eingabe.add(textfeld_name);
        eingabe.add(textfeld_passwort);
        add(eingabe, BorderLayout.CENTER);

        JPanel unten = new JPanel(new FlowLayout(FlowLayout.CENTER));
        add(unten, BorderLayout.SOUTH);
        JPanel knoepfe = new JPanel(new GridLayout(1, 2, 5, 5));
        knoepfe.add(new JButton("Anmelden"));
        knoepfe.add(new JButton("Abbrechen"));
        unten.add(knoepfe);

        setSize(400, 150);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                new Anmeldung2("Anmeldung").setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben