darstellungsprobleme mit JTabbedPane und GridBagLayout

BabySuna

Mitglied
Guten Tag zusammen

ich bin neu hier und ein Anfänger was die Java-Programmierung betrifft. ich hoffe hier auf kompetente Hilfe. Ich bringe mir die Java Sprache selber bei und habe schon einige Bücher, Foren und Quellcodes durch. Doch leider hänge ich gerade an einem Darstellungsproblem.

Ich möchte im ersten Tab vom JTabbedPane, welches 5 Tabs hat, eine Eingabemöglichkeit haben. Als Header soll eine Überschrift stehen. Soweit hat es auch geklappt. Die Anordnung ist korrekt. Lediglich die Größe lässt zu wünschen übrig. Warum ist es in der Mitte des Tabs und beginnt nicht am oberen Rand? Kann mir da einer helfen bzw auch erklären was ich falsch gemacht oder vergessen habe? Und wie bekomme ich das hin das ich jedes tab in einer separaten Datei schreiben kann. Dadurch würde sich für die Bearbeitung hinter her erleichtern. Und warum kann ich nicht ein Label mehrfach untereinander setzen?

mein Quellcode:

Java:
package haushaltsbuch;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.URL;

public class HBAussehen extends JFrame
{
    //Konstruktor
    public HBAussehen()
    {
        super("Haushaltsbuch");
        Container cp = getContentPane();
       
        //Erzeugen des Tabbed Panes
        JTabbedPane jtp = new JTabbedPane();
        JPanel pnl1 = new JPanel();
        JPanel pnl2 = new JPanel();
        JPanel pnl3 = new JPanel();
        JPanel pnl4 = new JPanel();
        JPanel pnl5 = new JPanel();
       
        //Aufbau des ersten Panels
        pnl1.setLayout(new GridBagLayout()); //Layout-Manager setzen
        pnl1.setSize(800,650);   //macht nichts
        GridBagConstraints c;
       
        //Abstände setzen
        Insets set = new Insets(5,5,5,5);
       
        //Eigenschaften für die Zelle 2,0 - Überschrift
        //Noch nicht mittig und zu klein - bearbeiten
        c = new GridBagConstraints();
        c.insets = set;        //Abstand
        c.gridx = 0;        //X-Position
        c.gridy = 0;        //Y-Position
        c.gridwidth = 1;    //Über wieviele Zellen es gehen soll
        c.anchor = GridBagConstraints.LINE_START;
        pnl1.add(new JLabel("HAUSHALTSBUCH"),c);
       
        //Eigenschaften für Zelle 0,2
        c = new GridBagConstraints();
        c.insets = set;        //Abstand
        c.gridx = 0;        //X-Position
        c.gridy = 2;        //Y-Position
        c.anchor = GridBagConstraints.LINE_START;
        pnl1.add(new JLabel("Kontostand: "),c);
       
        //Eigenschaften für Zelle 0,3
        c.gridy = 3;
        pnl1.add(new JLabel("Barvermögen 1: "),c);
       
        //Eigenschaften für Zelle 0,4
        c.gridy = 4;
        pnl1.add(new JLabel("Barvermögen 2:"),c);
       
        //Eigenschaften für Zelle 0,5
        c.gridy = 5;
        pnl1.add(new JLabel("Sparkonto -60: "),c);
       
        //Eigenschaften für Zelle 0,6
        c.gridy = 6;
        pnl1.add(new JLabel("Sparkonto -61: "),c);
       
        //Eigenschaften für Zelle 1,2
        c = new GridBagConstraints();
        c.insets = set;
        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 1;        //Über wieviele Zellen es gehen soll
        c.anchor = GridBagConstraints.LINE_START;
        pnl1.add(new JTextField(20),c);
       
        //Eigenschaften für Zelle 1,3
        c.gridy = 3;
        pnl1.add(new JTextField(20),c);
       
        //Eigenschaften für Zelle 1,4
        c.gridy = 4;
        pnl1.add(new JTextField(20),c);
       
        //Eigenschaften für Zelle 1,5
        c.gridy = 5;
        pnl1.add(new JTextField(20),c);
       
        //Eigenschaften für Zelle 1,6
        c.gridy = 6;
        pnl1.add(new JTextField(20),c);
       
        //Eigenschaften für Zelle 4,2
        c = new GridBagConstraints();
        c.insets = set;        //Abstand
        c.gridx = 4;        //X-Position
        c.gridy = 2;        //Y-Position
        c.anchor = GridBagConstraints.LINE_START;
        pnl1.add(new JLabel("EUR"),c);
       
        //Eigenschaften für Zelle 4,3
        c.gridy = 3;
        pnl1.add(new JLabel("EUR"),c);
       
        //Eigenschaften für Zelle 4,4
        c.gridy = 4;
        pnl1.add(new JLabel("EUR"),c);
       
        //Eigenschaften für Zelle 4,5
        c.gridy = 5;
        pnl1.add(new JLabel("EUR"),c);
       
        //Eigenschaften für Zelle 4,6
        c.gridy = 6;
        pnl1.add(new JLabel("EUR"),c);
       
       
        //Aufbau Panel 2
       
        //Aufbau Panel 3
       
        //Aufbau Panel 4
       
        //Zusammenstellen des TabbedPanes
        jtp.add("Profil",pnl1);
        jtp.add("Einstellungen",pnl2);
        jtp.add("Einnahmen",pnl3);
        jtp.add("Ausgaben",pnl4);
        jtp.add("Übersicht", pnl5);
       
        //JPanel zum ContentPane zuordnen
        BorderLayout gl = new BorderLayout();
        cp.setLayout(gl);
        jtp.setSize(800,650);  //macht auch nichts
        cp.add(jtp);
    }

   

}

So sieht mein Ergebnis aus:

haushaltsbuch1.png


Ich hoffe man versteht wo mein Problem ist.
Liebe Grüße
 
Zuletzt bearbeitet von einem Moderator:
@betatwo
danke für deine Antwort. Ich teste es gleich mal aus.

Ups ja mit dem Code hast du recht. Nicht dran gedacht, sry. Beim nächsten mal achte ich drauf.

liebe grüße
 
Das ist nicht ganz trivial. Am einfachsten ist es, das com.apple.laf.AquaLookAndFeel zu verwenden, sofern es bei dir installiert ist, denn das zentriert die Tabs:
Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;

public class HBAussehen extends JFrame {
//Konstruktor
    public HBAussehen() {
        super("Haushaltsbuch");
        Container cp = getContentPane();

//Erzeugen des Tabbed Panes
        JTabbedPane jtp = new JTabbedPane();
        JPanel pnl1 = new JPanel();
        JPanel pnl2 = new JPanel();
        JPanel pnl3 = new JPanel();
        JPanel pnl4 = new JPanel();
        JPanel pnl5 = new JPanel();

//Aufbau des ersten Panels
        pnl1.setLayout(new GridBagLayout()); // Layout-Manager setzen
        pnl1.setSize(800, 650); // macht nichts
        GridBagConstraints c;

//Abstände setzen
        Insets set = new Insets(5, 5, 5, 5);

//Eigenschaften für die Zelle 2,0 - Überschrift
//Noch nicht mittig und zu klein - bearbeiten
        c = new GridBagConstraints();
        c.insets = set; // Abstand
        c.gridx = 0; // X-Position
        c.gridy = 0; // Y-Position
        c.gridwidth = 1; // Über wieviele Zellen es gehen soll
        c.anchor = GridBagConstraints.LINE_START;
        pnl1.add(new JLabel("HAUSHALTSBUCH"), c);

//Eigenschaften für Zelle 0,2
        c = new GridBagConstraints();
        c.insets = set; // Abstand
        c.gridx = 0; // X-Position
        c.gridy = 2; // Y-Position
        c.anchor = GridBagConstraints.LINE_START;
        pnl1.add(new JLabel("Kontostand: "), c);

//Eigenschaften für Zelle 0,3
        c.gridy = 3;
        pnl1.add(new JLabel("Barvermögen 1: "), c);

//Eigenschaften für Zelle 0,4
        c.gridy = 4;
        pnl1.add(new JLabel("Barvermögen 2:"), c);

//Eigenschaften für Zelle 0,5
        c.gridy = 5;
        pnl1.add(new JLabel("Sparkonto -60: "), c);

//Eigenschaften für Zelle 0,6
        c.gridy = 6;
        pnl1.add(new JLabel("Sparkonto -61: "), c);

//Eigenschaften für Zelle 1,2
        c = new GridBagConstraints();
        c.insets = set;
        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 1; // Über wieviele Zellen es gehen soll
        c.anchor = GridBagConstraints.LINE_START;
        pnl1.add(new JTextField(20), c);

//Eigenschaften für Zelle 1,3
        c.gridy = 3;
        pnl1.add(new JTextField(20), c);

//Eigenschaften für Zelle 1,4
        c.gridy = 4;
        pnl1.add(new JTextField(20), c);

//Eigenschaften für Zelle 1,5
        c.gridy = 5;
        pnl1.add(new JTextField(20), c);

//Eigenschaften für Zelle 1,6
        c.gridy = 6;
        pnl1.add(new JTextField(20), c);

//Eigenschaften für Zelle 4,2
        c = new GridBagConstraints();
        c.insets = set; // Abstand
        c.gridx = 4; // X-Position
        c.gridy = 2; // Y-Position
        c.anchor = GridBagConstraints.LINE_START;
        pnl1.add(new JLabel("EUR"), c);

//Eigenschaften für Zelle 4,3
        c.gridy = 3;
        pnl1.add(new JLabel("EUR"), c);

//Eigenschaften für Zelle 4,4
        c.gridy = 4;
        pnl1.add(new JLabel("EUR"), c);

//Eigenschaften für Zelle 4,5
        c.gridy = 5;
        pnl1.add(new JLabel("EUR"), c);

//Eigenschaften für Zelle 4,6
        c.gridy = 6;
        pnl1.add(new JLabel("EUR"), c);

//Aufbau Panel 2

//Aufbau Panel 3

//Aufbau Panel 4

//Zusammenstellen des TabbedPanes
        jtp.add("Profil", pnl1);
        jtp.add("Einstellungen", pnl2);
        jtp.add("Einnahmen", pnl3);
        jtp.add("Ausgaben", pnl4);
        jtp.add("Übersicht", pnl5);

//        jtp.setUI(new BasicTabbedPaneUI() {
//        });
        try {
            LookAndFeelInfo[] installedLookAndFeels = UIManager.getInstalledLookAndFeels();
            for (LookAndFeelInfo lookAndFeelInfo : installedLookAndFeels) {
                System.out.println(lookAndFeelInfo);
            }
            UIManager.setLookAndFeel("com.apple.laf.AquaLookAndFeel");
            SwingUtilities.updateComponentTreeUI(this);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException
                | UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

//JPanel zum ContentPane zuordnen
        BorderLayout gl = new BorderLayout();
        cp.setLayout(gl);
        jtp.setSize(800, 650); // macht auch nichts
        cp.add(jtp);
    }

    public static void main(String[] args) {
        HBAussehen aussehen = new HBAussehen();
        aussehen.setPreferredSize(new Dimension(800, 600));
        aussehen.pack();
        aussehen.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        aussehen.setVisible(true);
    }
}

Die zweite Möglichkeit wäre, ein eigenes LaF zu schreiben, was ich mit:
Java:
        jtp.setUI(new BasicTabbedPaneUI() {
        });
angedeutet hatte. Aber ich fürchte, das übersteigt deine Fähigkeiten bei Weitem.

schönen Abend
 
ups, das war ja gar nicht dein Problem. Du hast dein Problem so schlecht beschrieben, dass keiner etwas damit anfangen kann. Kannst du dein Problem bitte noch mal klar und deutlich beschreiben, also was wie genau anders sein sollte, als es bisher ist? Und bitte richtiges Deutsch schreiben, also auch Satzzeichen verwenden usw. Danke.
 
Warum ist es in der Mitte des Tabs und beginnt nicht am oberen Rand?
"Unless you specify at least one non-zero value for weightx or weighty, all the components clump together in the center of their container. This is because when the weight is 0.0 (the default), the GridBagLayout puts any extra space between its grid of cells and the edges of the container." (https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html)

Und wie bekomme ich das hin das ich jedes tab in einer separaten Datei schreiben kann.
Einfach den Code in Klassen auslagern.

Und warum kann ich nicht ein Label mehrfach untereinander setzen?
Wie meinen?
 
Es gibt Look&Feels, die Tabs im Flowlayout anzeigen, woi dann bei Bedarf eine zweite Zeile angehängt wird. Die vorinstallierten Look&Feels zeigen sie in einer Zeile mit Scollpfeilen an.

Was du auch machen kannst (aber nicht musst): Verwende anstatt des TabLayouts ein CardLayout und erledige die Steuerung über AbstractButtons und eine ButtonGroup. Dann kannst du diese Buttons platzieren, wo du willst (auch ein Menü geht).

Und mihe hat's eh schon richtig zitiert. Du wirst dem GridbagLayout sagen müssen, welche Komponenten wie gestreckt werden sollen, ansonsten bleibt alles in der Mitte.
Das hat mit dem TabbedPane nichts zu tun. Du kannst die Elemente auch in einem Dialog oder Fenster anzeigen lassen mit dem selben Resultat.
 
Ich danke euch für eure hilfe. Es ist echt schwer sich selber das Programmieren beizubringen 😩 Ich habe zudem auch keinen in meiner nähe der das kann und mir helfen könnte. Aber ich gebe nicht auf und werde es schaffen. Ihr habt mir ein paar denkanstöße gegeben und es bedarf einier Begriffklärung.

Das TabLayout lege ich erst mal auf Eis und denke ich probiere es mit dem CardLayout.

Werde dann mal die Begrifflichkeiten klären und mich an das CardLayout begeben. Vielen Dank an euch alle.

Liebe Grüße
 

Neue Themen


Zurück
Oben