CardLayout in einem GridbagLayout

Hallo,

wie schaffe ich es, ein CardLayout in einem GridbagLayout zu verwirklichen?

Zur zeitige Programmstruktur:

OberesJPanel A bekommt GridbagLayout zugewiesen. Es enthält 2 weitere JPanels, JPanel A1 und JPanel A2, diese sind mittels “.setconstraints” festgelegt.

In A1 ist die Combobox, welche das CardLayout “steuert”.

Leider muss ich nun ein weiteres JPanel (nennen wir es mal B) erzeugen, welches das CardLayout zugewiesen bekommt. In diesem Panel B werden dann die die “Card”-JPanels B1, B2 und B3 eingefügt.
Schließlich binde ich nun das JPanel B in das JPanel A2 ein.

Was ich nun gerne wissen würde:

Kann ich irgendwie diesen Zwischenschritt mit dem Panel B umgehen?
Sprich B1, B2 und B3 direkt in A2 einfügen anstatt o.g.-Variante?
Wenn ich das nämlich versuche, bekomme ich immer folgende Fehlermeldung:
“IllegalArgumentException: cannot add to layout: constraint must be a string”

Wie man sich vielleicht denken kann, sieht mein Befehl dafür genauso aus:
“this.A2.add(B1, StringnameB1);” anstatt “this.B.add(B1, StringnameB1);”

Und dabei ist es egal, ob ich das JPanel A2 direkt mit einem CardLayout erzeuge oder es erst nachher mit “.setLayout” in eines verwandeln will.

Ich bin jetzt mit Java nicht so ganz fit, aber Layouts lassen sich verschachteln.
Vielleicht nimmst du dir mal die Zeit, die Java-Insel ab hier zu lesen.
Da findest du mit Sicherheit etwas, was dich weiterbringt.

naja, zwar durchgelesen, leider bin ich damit nicht weitergekommen…
Nutze immer noch diese Doppeltverschachtelung(Hatte es nicht erwähnt, aber wie du sagtest: Die doppelverschachtelung ist bei: Gridlayout, FlowLayout und BoxLayout problemlos möglich, was anderes hab ich nit ausprobiert.

Mittlerweile erfreue ich mich allerdings an weiteren Problemen, wie z.B. dem nicht funktionieren des “setsize”-befehls etc pp(keine Fehlermeldung oder so NEIN er macht einfach nix)
Möchte die Liste an Probs mal hier stoppen, werde wohl im üblichen “Anstarren bis Verstehen”-Verfahren weitermachen.

und wieder ein Problem weniger ;D das Verfahren führt zum Erfolg!

Wenn du noch Hilfe brauchst, solltest du mal eine Skizze oder ein Bild vom Ist- und vom Sollzustand hinzufügen.
Die ganze Erzählung um A1, B2 und PanelOben usw. kann niemand wirklich nachvollziehen.

Btw, statt GridBagLayout scheint sich hier auch BorderLayout anzubieten: Combo im NORTH CardLayout panel im CENTER.

Also ich lad einfach mal das Layout hoch. Da wird es vielleicht sogar klarer, als unklarer.
Habe in dieser Version allerdings sämtliche Buttons und listener rausgenommen(den ItemListener ausgenommen), daher kommt es bezüglich GridbayLayout zu einigen falsch eingestellten “weights”. Dies bitte ignorieren:

import java.awt.*;
import javax.swing.*;
import java.security.*;
import java.math.BigInteger;
import java.lang.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.event.*;



public class Laufzeiten extends Frame implements ItemListener
{
  //Ist nun nach Tabs sortiert.
  public JTabbedPane tabbedPane = new JTabbedPane();

  //Panels für Taubenanalysator
  public Container TaubenAnalysator = new Container();
  public JPanel TaubenMenu = new JPanel();
  public JPanel TaubenAnsicht = new JPanel(new GridLayout(1,1));
  public JPanel TaubenUebersichtAnsicht = new JPanel(new CardLayout());
  public JPanel TaubenDetailAnsicht = new JPanel(new GridLayout(7,7));
  public JPanel TaubenStaemmeAnsicht = new JPanel();
  public JPanel TaubenStandardAnsicht = new JPanel();
  //Elemente des T-As
  public JComboBox jcbTaubenCombobox;
  
  //Panels für Laufzeitenrechner
  public Container Laufzeitenrechner = new Container();
  public JPanel LaufzeitenMenu = new JPanel();
  public JPanel LaufzeitenAnsicht = new JPanel(); //<= so vll die Cardfkt usen
  //Elemente des L-Rs
  public Laufzeiten()  //der Konstruktor
  {
    super("Tolles Tool");
    //this.addWindowListener(new MyWinListener(this)); //Standardwindowcontroll

    //ANFANG ERSTER TAB: TAUBENANALYSATOR==============================================================================================
    //Hier findet die Vordefinition des Taubenanalysators statt
    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints c = new GridBagConstraints();
    TaubenAnalysator.setLayout(gridbag);
    c.fill = GridBagConstraints.HORIZONTAL;

    //Taubenmenu
    TaubenMenu.setBorder(BorderFactory.createTitledBorder("Scan:"));
    TaubenMenu.setLayout(new GridLayout(20,1,0,5));
    c.ipady = 327;
    c.weightx = 0.5;
    c.gridx = 0;
    c.gridy = 0;
    gridbag.setConstraints(TaubenMenu, c);
    TaubenAnalysator.add(TaubenMenu);
    TaubenMenuBelegung();

    //TaubenAnsicht
    c.weightx = 15.0;
    c.gridx = 1;
    c.gridy = 0;
    gridbag.setConstraints(TaubenAnsicht, c);
    TaubenAnalysator.add(TaubenAnsicht);
    TaubenAnsicht.add(TaubenUebersichtAnsicht);

    tabbedPane.addTab("Taubenanalysator", TaubenAnalysator);
    //ENDE ERSTER TAB------------------------------------------------------------------------------------------------------------------

    //ANFANG ZWEITER TAB: LAUFZEITENRECHNER============================================================================================
    //Hier findet die Vordefinition des Laufzeitenrechners statt

    GridBagConstraints d = new GridBagConstraints();
    this.Laufzeitenrechner.setLayout(gridbag);
    d.fill = GridBagConstraints.HORIZONTAL;


    LaufzeitenMenu.setBorder(BorderFactory.createTitledBorder("Angriff:"));
    LaufzeitenMenu.setLayout(new GridLayout(20,1,0,5));
    d.ipady = 327;
    d.weightx = 0.5;
    d.gridx = 0;
    d.gridy = 0;
    gridbag.setConstraints(LaufzeitenMenu, d);
    Laufzeitenrechner.add(LaufzeitenMenu);

    LaufzeitenAnsicht.setBorder(BorderFactory.createTitledBorder("Laufzeiten:"));
    d.ipady = 327;
    d.weightx = 15.0;
    d.gridx = 1;
    d.gridy = 0;
    gridbag.setConstraints(LaufzeitenAnsicht, d);
    Laufzeitenrechner.add(LaufzeitenAnsicht);
    tabbedPane.addTab("Laufzeitenrechner", Laufzeitenrechner);
    //ENDE ZWEITER TAB-----------------------------------------------------------------------------------------------------------------
    add(tabbedPane, BorderLayout.CENTER);

    setSize(900,525);
    setLocation(200,200);
    //setResizable(false);
    setVisible(true);
  }
  
  public static void main(String argv[])
  {
    Laufzeiten E1 = new Laufzeiten();
  }
  
  private void TaubenMenuBelegung()
  {
    String Tauben_Detailansicht = "Detailierter Bericht", Tauben_Staemmeansicht = "Verbesserte Übersicht",
      Tauben_Standardansicht = "Standardtaube";
    String comboBoxItems[] = {Tauben_Detailansicht, Tauben_Staemmeansicht, Tauben_Standardansicht};

    jcbTaubenCombobox = new JComboBox(comboBoxItems);
    jcbTaubenCombobox.setEditable(false);
    jcbTaubenCombobox.addItemListener(this);
    TaubenMenu.add(jcbTaubenCombobox);

    for(int n = 0; n < 4; n++)
    {
      TaubenMenu.add(new JPanel());
    }

    TaubenDetailAnsicht.setBorder(BorderFactory.createTitledBorder("Detailierter Bericht:"));
    TaubenStaemmeAnsicht.setBorder(BorderFactory.createTitledBorder("Vereinfachte Übersicht:"));
    TaubenStandardAnsicht.setBorder(BorderFactory.createTitledBorder("Standardansicht:"));
    TaubenUebersichtAnsicht.add(TaubenDetailAnsicht, Tauben_Detailansicht);
    TaubenUebersichtAnsicht.add(TaubenStaemmeAnsicht, Tauben_Staemmeansicht);
    TaubenUebersichtAnsicht.add(TaubenStandardAnsicht, Tauben_Standardansicht);
  }

  //Methode für den Itemlistener
  public void itemStateChanged(ItemEvent evt)
  {
    CardLayout cl = (CardLayout)(TaubenUebersichtAnsicht.getLayout());
    String a = evt.getItem().toString();
    cl.show(TaubenUebersichtAnsicht, a);
  }
}```

Anmerkung:
Diese Version läuft in einem Javaeditor, nur lässt sie sich nicht beenden, da ich außer den Buttons(darunter auch den jbtnExit) auch den Windowlistener rausgenommen habe.

Folgende Fragen dazu:
Die JPanelgröße von z.B. meinem TaubenMenu ist viel zu groß, wie kann ich das ändern?
Desweiteren bleibt die schongestellte GridbagLayout => CardLayout Frage. :)

[QUOTE=Andreas85]Die JPanelgröße von z.B. meinem TaubenMenu ist viel zu groß, wie kann ich das ändern?
Desweiteren bleibt die schongestellte GridbagLayout => CardLayout Frage. :)[/QUOTE]
Für TaubenMenu müsste es genügen, ein weighty zu setzen.
TaubenUebersichtAnsicht konnte ich problemlos entfernen (und CardLayout bei TaubenAnsicht setzen):

//  public JPanel TaubenUebersichtAnsicht = new JPanel(new CardLayout());
...
//    TaubenAnsicht.add(TaubenUebersichtAnsicht);
...
    TaubenAnsicht.add(TaubenDetailAnsicht, Tauben_Detailansicht);
    TaubenAnsicht.add(TaubenStaemmeAnsicht, Tauben_Staemmeansicht);
    TaubenAnsicht.add(TaubenStandardAnsicht, Tauben_Standardansicht);
...
    CardLayout cl = (CardLayout)(TaubenAnsicht.getLayout());
...
    cl.show(TaubenAnsicht, a);

“Frame” sollten wir am besten durch “JFrame” ersetzen:
public class Laufzeiten extends JFrame implements ItemListener
Dann braucht man auch nicht unbedingt einen WindowListener:
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

THX!!!

Das Panelgrößen-Problem beim TaubenMenu konnte ich mit einem weighty noch nicht lösen, ABER der Rest…
Der Rest ist so ziemlich PERFEKT! :slight_smile:

Achja, sry wegen dem falschen Kommentar bei LaufzeitenAnsicht, ist mir zu spät aufgefallen und hatte es daher vergessen rauszunehmen.
Die Idee mit dem JFrame ist auch sehr gut :slight_smile: wusste gar nicht, das es auch so einfach geht. :slight_smile: Wurde daher auch direkt umgesetzt.
Zu guter Letzt:
Keine Ahnung, warum das mit dem CardLayout auf einmal geht, aber es geht dank dir! :slight_smile:
Ich hätte es wahrscheinlich kein weiteres Mal probiert, dachte das ich auch den Itemlistener immer dafür umgestellt hätte aber naja, das könnte eine potenzielle Fehlerquelle gewesen sein.

Wegen der Quellcode-Formatierung:
Wie schaut da der Befehl aus? Hatte zwar Java eingestellt, aber mehr als ein „CODE“ „/CODE“ in [] bekam ich da nicht, egal welchen Codetyp ich auswähle(und JA ich habe alle Skripte für diese Seite erlaubt).

Wenn man streng nimmt kann dieser Thread eigentlich geschlossen werden, da das Poblem, welches im Topic genannt wird nicht mehr existent ist.

Ersetze bitte ‚code‘ mit ‚java‘ (oder eben mit der Sprache, die du möchtest).

[QUOTE=Andreas85;11259]
Wenn man streng nimmt kann dieser Thread eigentlich geschlossen werden, da das Poblem, welches im Topic genannt wird nicht mehr existent ist.[/QUOTE]

Als angemeldetes Mitglied kann man die eigenen Themen selber schließen. :wink:

Wunsch entsprochen - Thema geschlossen.