Der Swing Layout-Manager hasst mich

c0rnfl4k3s

Mitglied
Hi zusammen,
ich sitze jetzt ohne Witz seit 8 Stunden an dieser frustrierenden Aufgabe. Ich gebe jetzt endgültig das rumprobieren, nachdenken und googlen auf und wende mich an euch, meine letzte Hoffnung. (Die mich noch nie entäuscht hat ;))

Also, kurz und knackig, ich muss eine simple GUI für einen Terminkalender schreiben, und dafür das JGridBagLayout verwenden. Ich beschreibe jetzt mal nur den konkreten Teil der Aufgabe, der mir bis jetzt Probleme bereitet.
Im oberen Teil des Anfangsfensters soll mittig der aktuelle Monat und das Jahr als JLabel stehen. Direkt rechts und links daneben jeweils ein JButton, um einen Monat vor- oder zurück zu springen.
In der Reihe darunter, ebenfalls mittig, ein "Wählen..."-button, um Tag und Monat manuell einzugeben (in einem Popup-Fenster, darum kümmer ich mich aber noch gar nicht).
Und dann direkt darunter eine JTable innerhalb einer JScrollPane. Die beiden Spalten der Tabelle heißen "Tag" und "Termine". Die Zeilenanzahl entspricht der Anzahl der Tage im Monat. Unter "Tag" steht der halt der Tag als Zahl, und unter "Termine" steht die Anzahl der Termine an dem Tag. Das ist soweit alles.

Was ich habe:
- Alle Elemente werden erzeugt und erscheinen im Fenster, in der richtigen Gitter-Zeile.
- Die Inhalte der Tabelle sind ohne Fehler.

Um eventhandler usw kümmere ich mich später noch.

Meine Probleme:
- Die Buttons und das Label mittig positionieren
- Die Größe der Tabelle verändern (sie ist standardmäßig viel zu groß, und die Größe ist statisch. Bei einem kleineren Fenster soll sie dieses bis zum Rand ausfüllen. Am besten sogar dynamisch an veränderungen vom Fensterrand anpassen, bzw nur die Breite.)

Mein Ausschnitt des Codes:
Java:
import javax.swing.*;
import java.awt.*;
import java.time.LocalDate;

public class CalendarWindow extends JFrame {

    byte monat = (byte) 1;//(LocalDate.now().getMonth().getValue() - 1);
    short jahr = (short) 2099;//LocalDate.now().getYear();

    public CalendarWindow(Appointments termine) {

        setSize(400, 700); // x * y in Pixeln
        setTitle("Kalender"); // Name des Fensters
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Programm mit Klick auf "X" terminieren
        setLayout(new GridBagLayout());

        // Benötigte Objekte erzeugen

        Container contentPane = getContentPane(); // FRAGEN: Wofür brauche ich das? Funktioniert auch ohne.
        JButton links = new JButton("<");
        JLabel currentMonth = new JLabel(DateUtil.MONTH[monat] + " " + jahr);
        JButton rechts = new JButton(">");
        JButton waehlen = new JButton("Wählen...");

        String[][] tableData = new String[DateUtil.daysOfMonth(monat, jahr)][2];
        for (byte i = 0; i < DateUtil.daysOfMonth(monat, jahr); i++) {
            tableData[i][0] = "" + (i + 1) + ".";

            switch(termine.count(i, monat, jahr)){
                case 0:
                    break;
                case 1:
                    tableData[i][1] = "1 Termin";
                    break;
                default:
                    tableData[i][1] = "" + termine.count(i, monat, jahr) + " Termine";
            }
        }
        String[] columnNames = { "Tag", "Termine" };
        JTable table = new JTable(tableData, columnNames);
        JScrollPane hauptteil = new JScrollPane(table);

        GridBagConstraints c = new GridBagConstraints(); // zum "navigieren" der Position
        c.fill = GridBagConstraints.NONE; // Elemente waagerecht anordnen
//        c.insets = new Insets(6, 6, 6, 6); // Abstände der Elemente voneinander

        // Oberer Teil, Auswahl des Monats usw.
       
        c.anchor = GridBagConstraints.EAST;
        c.gridwidth = 2;
        c.gridx = 2;
        c.gridy = 1;
        add(links, c);

        c.anchor = GridBagConstraints.CENTER;
        c.gridwidth = 2;
        c.gridx = 3;
        c.gridy = 1;
        add(currentMonth, c);
       
//        c.gridx = 3;
        c.gridy = 2;
        add(waehlen, c);

        c.anchor = GridBagConstraints.WEST;
        c.gridwidth = 2;
        c.gridx = 4;
        c.gridy = 1;
        add(rechts, c);

        // Tabelle

//        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.BASELINE;
        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 6;
        add(hauptteil, c);
        c.gridwidth = 1;


//        pack();
        setVisible(true);
    }

}

die GridBagConstraints habe ich vorerst absichtlich redundant aufgeschrieben, für jedes einzelne element, weil ich sonst den überblick verliere. Außerdem habe ich sie schon tausend mal verändert und alles mögliche ausprobiert was mir in den Sinn kam, deswegen ergeben die aktuellen Werte weniger Sinn als mein erster Versuch.

Ich dachte mir zuerst, ja cool ich kann im gitter einfach die x und y koordinate eintragen, und das element erscheint dann genau dort.
Aber dann kommt halt der layout manager und sagt "Ach, du willst es in der Mitte? Ne du, ich kleb die buttons mal lieber an den Rand, ist viel cooler so."
Alles klar Swing, Danke für nichts :D

Aber Danke an euch schonmal im Voraus :)
 

c0rnfl4k3s

Mitglied
Update: der Code sieht inzwischen so aus:
Java:
import javax.swing.*;
import java.awt.*;
import java.time.LocalDate;

public class CalendarWindow extends JFrame {

    byte monat = (byte) 1;//(LocalDate.now().getMonth().getValue() - 1);
    short jahr = (short) 2099;//LocalDate.now().getYear();

    public CalendarWindow(Appointments termine) {

        Container contentPane = getContentPane(); // FRAGEN: Wofür brauche ich das? Funktioniert auch ohne.
//        setSize(400, 700); // x * y in Pixeln
        setTitle("Kalender"); // Name des Fensters
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Programm mit Klick auf "X" terminieren
        setLayout(new GridBagLayout());

        // Benötigte Objekte erzeugen

        JButton links = new JButton("<");
        JLabel currentMonth = new JLabel(DateUtil.MONTH[monat] + " " + jahr);
        JButton rechts = new JButton(">");
        JButton waehlen = new JButton("Wählen...");

        String[][] tableData = new String[DateUtil.daysOfMonth(monat, jahr)][2];
        for (byte i = 0; i < DateUtil.daysOfMonth(monat, jahr); i++) {
            tableData[i][0] = "" + (i + 1) + ".";

            switch(termine.count(i, monat, jahr)){
                case 0:
                    break;
                case 1:
                    tableData[i][1] = "1 Termin";
                    break;
                default:
                    tableData[i][1] = "" + termine.count(i, monat, jahr) + " Termine";
            }
        }
        String[] columnNames = { "Tag", "Termine" };
        JTable table = new JTable(tableData, columnNames);
        JScrollPane hauptteil = new JScrollPane(table);

        GridBagConstraints c = new GridBagConstraints(); // zum "navigieren" der Position
        c.fill = GridBagConstraints.NONE; // Elemente waagerecht anordnen
//        c.insets = new Insets(6, 6, 6, 6); // Abstände der Elemente voneinander

        // Oberer Teil, Auswahl des Monats usw.
       
        c.anchor = GridBagConstraints.WEST;
        c.gridwidth = 1;
        c.gridx = 3;
        c.gridy = 1;
        add(links, c);

        c.anchor = GridBagConstraints.CENTER;
        c.gridwidth = 1;
        c.gridx = 3;
        c.gridy = 1;
        add(currentMonth, c);
       
        c.gridy = 2;
        add(waehlen, c);

        c.anchor = GridBagConstraints.EAST;
        c.gridwidth = 1;
        c.gridx = 3;
        c.gridy = 1;
        add(rechts, c);

        // Tabelle

        c.anchor = GridBagConstraints.WEST;
        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 3;
        add(hauptteil, c);


        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

}

Und das Fenster ist damit auch schon etwas besser. Habe aber immer noch keins der beiden Hauptprobleme gelöst.
 

X5-599

Top Contributor
Beim GridBagLayout komm ich auch öfters nur durch rumprobieren zu einem akzeptablen Ergebnis... So ist z.B. dieser Code hier entstanden:

Code:
GridBagConstraints c;

// Oberer Teil, Auswahl des Monats usw.
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
add(links, c);

c = new GridBagConstraints();
c.weightx = 1.0;
c.gridx = 1;
c.gridy = 0;
add(currentMonth, c);

c = new GridBagConstraints();
c.gridy = 1;
c.gridx = 1;
add(waehlen, c);

c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 0;
add(rechts, c);

// Tabelle
c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 3;
add(hauptteil, c);
 

c0rnfl4k3s

Mitglied
Beim GridBagLayout komm ich auch öfters nur durch rumprobieren zu einem akzeptablen Ergebnis... So ist z.B. dieser Code hier entstanden:

Code:
GridBagConstraints c;

// Oberer Teil, Auswahl des Monats usw.
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
add(links, c);

c = new GridBagConstraints();
c.weightx = 1.0;
c.gridx = 1;
c.gridy = 0;
add(currentMonth, c);

c = new GridBagConstraints();
c.gridy = 1;
c.gridx = 1;
add(waehlen, c);

c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 0;
add(rechts, c);

// Tabelle
c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 3;
add(hauptteil, c);
Warum genau tauscht du die GridBagConstraints bei jedem GUI-Element durch ein neues Objekt aus? Ist es nicht besser, einfach die Werte der Variablen anzupassen?
 

X5-599

Top Contributor
Ganz einfach aus dem Grund, weil ich sonst ganz genau aufpassen muss welche Attribute ich im vorherigen Schritt verwendet habe und diese evtl erst wieder auf den default Wert zurücksetzen muss. Man kann ein und dasselbe GridBagConstraints Objekt verwenden. Man muss sich aber im Klaren sein, dass alle Attribute die man einmal gesetzt hat beim jeweils nächsten Verwenden immernoch gelten.

z.B. hätte ich nur ein GridBagConstraints Objekt benutzt würde für die dritte Verwendung (waehlen) immer noch das weightx von 1.0 gelten. Das könnte Probleme (ungewolltes Verhalten des Layouts) machen. Ist mir in der Vergangenheit öfters passiert. Mir ist auch kein Nachteil bekannt jedes mal ein neues GridBagConstraints Objekt zu erstellen.

Da mir, wie gesagt, das GridBagLayout von sich aus öfters mal einiges an "rumprobieren" abverlangt, bin ich dazu übergegangen jedesmal neue GridBagConstraints Objekte zu verwenden. Somit weiss ich wenigstens hier genau welche Attribute (Constraints) wo gelten. Kann natürlich jeder halten wie er möchte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Layout bei Swing Java Basics - Anfänger-Themen 4
Bierhumpen Swing und Layout Java Basics - Anfänger-Themen 18
L Swing - Layout-Problem Java Basics - Anfänger-Themen 12
J SWING UI Designer und zeichnen Java Basics - Anfänger-Themen 4
G Maven Swing: Wie verwende ich WindowListener ? Java Basics - Anfänger-Themen 2
C Threads und Swing Java Basics - Anfänger-Themen 9
A Swing: Raumshiff Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
nbergmann Wo ist javax.swing.JOptionPane gespeichert? Java Basics - Anfänger-Themen 4
StevenGG Java swing "New Integer" Java Basics - Anfänger-Themen 5
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
O ImageIcon, Swing Java Basics - Anfänger-Themen 1
O Swing JPanel Java Basics - Anfänger-Themen 4
F Swing - Fehler - Paint Methode Java Basics - Anfänger-Themen 7
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
M Wie kann ich hier ein Textfeld hinzufügen Java Swing? Java Basics - Anfänger-Themen 1
M SpielMenü mit Swing Java Basics - Anfänger-Themen 3
M Wie kann ich eine Eingabe im Java-Swing übergeben? Java Basics - Anfänger-Themen 1
N javax swing JOptionPane Hilfe Java Basics - Anfänger-Themen 3
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
M Java swing im Browser starten Java Basics - Anfänger-Themen 0
M JavaFX in Swing-Applikationen einbetten Java Basics - Anfänger-Themen 5
Z Threads SWING mit EventQueue.invokeLater Java Basics - Anfänger-Themen 1
P JDK installieren javac behauptet Javax.swing existiert nicht Java Basics - Anfänger-Themen 8
K Ascii Converter mit Swing Java Basics - Anfänger-Themen 4
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
N Erste Schritte Karte in SWING Application Java Basics - Anfänger-Themen 4
D Mehrfacherfassung in Swing GUI Java Basics - Anfänger-Themen 12
D Datum aus Swing in MySQL DB speichern Java Basics - Anfänger-Themen 22
R warum kann System.out.println(..) etwas, was Swing-Elemente Nicht können ? Java Basics - Anfänger-Themen 11
J Input/Output Charset Swing- Eingaben? Java Basics - Anfänger-Themen 8
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
B Swing intstalliert Eclips{}, mackiert Rot Java Basics - Anfänger-Themen 6
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
B Java Swing "Zeichenfläche" Java Basics - Anfänger-Themen 1
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Platzieren von Komponenten in Swing Applet funktioniert nicht Java Basics - Anfänger-Themen 3
P Hintergrundbild in Swing einfügen Java Basics - Anfänger-Themen 3
C Swing frage Java Basics - Anfänger-Themen 8
T Rechenprogramm mit Swing Java Basics - Anfänger-Themen 3
K Swing Darstellungsproblem Java Basics - Anfänger-Themen 11
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
P Swing - Blackscreen Java Basics - Anfänger-Themen 10
Y Random-Objekt und Swing Java Basics - Anfänger-Themen 4
M Klassen Hilfe bei SWING Java Basics - Anfänger-Themen 5
S GUI Problem: Swing Java Basics - Anfänger-Themen 8
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
B Erste Schritte Primefaces -> Swing Gui Java Basics - Anfänger-Themen 7
T Swing, SWT oder JavaFX Java Basics - Anfänger-Themen 8
S Programmoberfläche mit Java-Swing - Herangehensweise Java Basics - Anfänger-Themen 20
E Fragen zu paintXXX in Swing Java Basics - Anfänger-Themen 7
D Erste Schritte bash-Befehl mit Swing ausführen Java Basics - Anfänger-Themen 8
A Alternative zum manuellen Swing programmieren?? Java Basics - Anfänger-Themen 4
S Android fuer Swing-Kenner..? Java Basics - Anfänger-Themen 6
J Swing Timer Java Basics - Anfänger-Themen 3
B Seltsamer Fehler in SWING anwendung Java Basics - Anfänger-Themen 2
D GPS Tracker Swing Java Basics - Anfänger-Themen 2
L Erste Schritte Swing oder SWT Paint mit Grafikkarte? Java Basics - Anfänger-Themen 7
B Einstieg in swing GUI Java Basics - Anfänger-Themen 7
S Swing Eingabe Erzwingen Java Basics - Anfänger-Themen 3
S Swing JTable Java Basics - Anfänger-Themen 7
Z Input/Output Programm mit Swing umsetzen Java Basics - Anfänger-Themen 6
K Eclipse wie Swing per Drag und Drop erstellen Java Basics - Anfänger-Themen 2
V Dropdown Button in einer GUI (Java Swing) Java Basics - Anfänger-Themen 12
S Swing, Gridbaglayout Panel in Panel;funzt nicht!! Java Basics - Anfänger-Themen 3
O swing komponenten werden nicht angezeigt Java Basics - Anfänger-Themen 6
S Swing, Panel über Hintergrundbild!! Java Basics - Anfänger-Themen 6
P Im Fenster bleiben (swing) Java Basics - Anfänger-Themen 16
M Einfacher Swing Wizard Java Basics - Anfänger-Themen 3
E Swing FileWrite?? Java Basics - Anfänger-Themen 3
S Umlaute in Swing-GUI Java Basics - Anfänger-Themen 8
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
M Swing Klasse auch per Kommandozeile starten? Java Basics - Anfänger-Themen 2
S JAVA Swing Eventlistener Java Basics - Anfänger-Themen 11
P Swing - Welche Klasse für ausgeben von Ergebnissen? Java Basics - Anfänger-Themen 3
V Swing Componenten werden auf Mac nicht angezeigt Java Basics - Anfänger-Themen 19
J Überfordert mit Swing Java Basics - Anfänger-Themen 5
B Baum > Baum-Swing Java Basics - Anfänger-Themen 4
B Bei Swing weg vom North-West-South-East-Prinzip Java Basics - Anfänger-Themen 2
K Swing Fenster jede sec.neuzeichnen Java Basics - Anfänger-Themen 14
F Werteübergabe in Swing Formularen (gui Builder) Java Basics - Anfänger-Themen 9
L Swing GridBagLayout Java Basics - Anfänger-Themen 3
K Bild als Hintergrund in einem Swing Fenster Java Basics - Anfänger-Themen 21
J unterschied zwischen awt und swing Java Basics - Anfänger-Themen 6
C Swing i.V.m. Threads Java Basics - Anfänger-Themen 2
J XML Viewer for Swing Java Basics - Anfänger-Themen 6
Y Anfänger Hausaufgabe... Swing Java Basics - Anfänger-Themen 6
W Zeichnen in Swing Java Basics - Anfänger-Themen 7
B Swing Applikation mit mehreren Klassen Java Basics - Anfänger-Themen 2
C Swing, Buttons Wert zuweisen Java Basics - Anfänger-Themen 3
Luk10 Swing timer und Threads Java Basics - Anfänger-Themen 4
J Java GUI in Swing und das MVC Paradigma Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben