Swing CardLayout Maximum Size

Status
Nicht offen für weitere Antworten.

Dragonfire

Bekanntes Mitglied
Hihu,

ich verwende ein CardLayout um die Panles auszuwechseln.
Nun hab ich ein Panel,
welches riesig ist (ca. 800 x 2000) und deshalb in einem JSCrollPane eingepackt ist.

Ich übergebe dem CardLayout das JScrollPane mit dem riesigen Panel drin.

Soweit funktioniert auch alles,
wenn ich dann aber vom riesen großen Panel wieder zurückwechsel,
haben alle Panels von CardLayout diese bombastische Größe von ca 800 x 2000!

String ViewPanel = "OverviewPanel";
(JPanel) viewP ist das große Panel mit ca. 800 x 2000;
(JPanel) main ist das Panel mit dem CardLayout;

Java:
this.viewP = new OverviewPanel(this.main);
        JScrollPane viewSP = new JScrollPane();
        viewSP.setViewportView(this.viewP);
        viewSP.setViewportBorder(BorderFactory.createEmptyBorder());
        viewSP.setBorder(BorderFactory.createEmptyBorder());
        this.main.add(viewSP, this.ViewPanel);

Die Größe von viewP variiert immer und ich kann sie ja zwischendurch mit
setPreferredSize auf 0x0 setzten,
allerdings haben die anderern Cards im Layout diese riesige Größe dann bereits schon.

Gibt es eine Möglichkeit die ursprüngliche Größe jeder Componente wiederherszustellen?
Oder sollte ich lieber viewP aus dem CardLayout ganz rausnehmen?
Hat jemand vielleicht eine andere geniale Idee?
 

Marco13

Top Contributor
Hab's jetzt nicht ganz nachvollziehen können - ein compilierbares Beispiel würde da ggf. helfen. Ansonsten der Standard-Tipp bei Layoutfragen: Ruf mal irgendwo ein paar mal "validate()" auf :rolleyes:
 

Dragonfire

Bekanntes Mitglied
ok,
Quellcode zu posten wird schwer ...
Das ist nur ein kleiner Bestandteil eines etwas
größeren Projektes.
Sind mehrere Klassen die da zusammenspielen ...
Ich erläutere mal.

Es handelt sich um ein Programm welches Fragen generiert und anzeigt ...
auf einen "FragenPanel".
Danach kommt halt ein weiteres Panel,
ob die Frage richtig war oder nicht,
auf einem "AuswertungsPanel".

Diese beiden Panels sind von der Größe maximal 500x400 groß (width x height)
und werden über das CardLayout ausgetauscht.

Dem Benutzer wird die Möglichkeit geboten alle Fragen anzuschauen,
dies ist ein eigenes Panel, dem
"(Over)viewPanel" mit einer extremen Größe von ca. 800x2000 (width x height).

Dieses Panel wird erst bei Aufruf generiert.
Anschließend hat das "FragenPanel" und das "AuswertungsPanel" auch die Größe 800x2000, was natürlich viel zu groß ist und den Bildschirm sprengt
(vorallem ohne Scrollbar).

validate() hab ich schon beim Frame und den einzelnen Komponenten versucht.
pack() hilft auch nicht.
Ich kann zwar manuell die preferredSize setzten,
müsste dann aber umständlich von jedem JComponent die letzte Größe speichern,.
Kennt jemand eine einfache Lösung?
 

Dragonfire

Bekanntes Mitglied
Ich hab jetzt mal ein kleines Beispiel programmiert,
welches die Situation wiederspiegelt:

Klickt mal auf "ViewPanel" und dann auf "Frage" oder "Auswertung"
Das Panel sprengt den Bildschirm :-(

Java:
package gerhardtComponent;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import java.awt.CardLayout;
import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CardProblem
{
//DATENFELDER

    private JPanel fragePanel;
    private JPanel auswertungsPanel;
    private JPanel viewPanel;
    
    private JPanel root;
    private JFrame f;
    
    private JPanel main;
    private CardLayout cardLayout;

//KONSTRUKTOREN    
    
    /**
     * Constructor for objects of class CardProblem
     */
    public CardProblem()
    {
        init();
        
        f = new JFrame("CardProblem");
        f.add(root);
        f.pack();
        f.setVisible(true);
    }
    
//METHODEN
    
    public void init()
    {
        main = new JPanel();
        cardLayout = new CardLayout();
        main.setLayout(cardLayout);
        
        fragePanel = new JPanel();
        fragePanel.add(new JLabel("Eine Frage"));
        main.add(fragePanel, "Frage");
        
        auswertungsPanel = new JPanel();
        auswertungsPanel.add(new JLabel("Auswertung"));
        main.add(auswertungsPanel, "Auswertung");
        
        viewPanel = new JPanel();
        viewPanel.add(new JLabel("noch leer"));
        main.add(viewPanel, "ViewPanel");
        
        root = new JPanel();
        root.setLayout(new BorderLayout());
        
        JScrollPane sP = new JScrollPane();
        sP.setViewportView(main);
        
        root.add(sP, BorderLayout.CENTER);
        
        JPanel buttonPanel = new JPanel();
        
        JButton frage = new JButton("Frage");
        frage.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                cardLayout.show(main, "Frage");
                f.pack();
            }
            
        });
        buttonPanel.add(frage);
        
        JButton auswertung = new JButton("Auswertung");
        auswertung.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                cardLayout.show(main, "Auswertung");
                f.pack();
            }
            
        });
        buttonPanel.add(auswertung);
        
        JButton view = new JButton("ViewPanel");
        view.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                generateData();
                cardLayout.show(main, "ViewPanel");
                f.pack();
            }
            
        });
        buttonPanel.add(view);
        
        root.add(buttonPanel, BorderLayout.SOUTH);
    }
    
    /**
     * Generiert den Inhalt
     */
    private void generateData()
    {
         viewPanel.removeAll();
         
         String tmp = "<html>";
         
         for(int i = 0; i < 500; i++)
         {
             tmp += "INHALT<br>";
         }
         
         tmp += "</html>";
         viewPanel.add(new JLabel(tmp));
    }

}//class close

Meine temporäre Lösung ist:

Ich nehme das viewPanel aus dem CardLayout heraus
(packe es erst garnicht rein).
Entferne das Panels mit dem CardLayout und füge mein viewPanel manuell ein.
Will ich wieder anderer Komponenten haben packe ich das Panel mit dem
CardLayout rein.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hm ... OK, das hilft schonmal - aber ... was spricht jetzt dagegen, dem root-Panel oder der ScrollPane eine angemessene PreferredSize zu geben? Oder SOLL sich die Fenstergröße beim Umschalten zwischen den Cards ändern? (das f.pack() könnte/sollte dann ggf. auch aus den ActionListenern raus)
 

Dragonfire

Bekanntes Mitglied
Hm ... OK, das hilft schonmal - aber ... was spricht jetzt dagegen, dem root-Panel oder der ScrollPane eine angemessene PreferredSize zu geben? Oder SOLL sich die Fenstergröße beim Umschalten zwischen den Cards ändern? (das f.pack() könnte/sollte dann ggf. auch aus den ActionListenern raus)


Danke für die Lösungsidee,
ich überdenke dies im Originalprogramm nochmal.


b2t:

Also das f.pack sollte bleiben,
da sich eventuell die Größe minimal verändert ...
nicht hier im Beispiel,
aber im Originalprogramm ;)

wenn ich den root oder den ScrollPane festsetzte,
dann sind die Karten ja fest.

Setzte ich hingegen die Größe vom ViewPanel fest,
bekommt man keine ScrollBalken :-(

oder ist:

Java:
viewPanel.setPreferredSize(new java.awt.Dimension(100,200));

die falsche Anweisung dafür?

Hier das komplette Programm ...

Java:
package gerhardtComponent;
 
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import java.awt.CardLayout;
import java.awt.BorderLayout;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class CardProblem
{
//DATENFELDER
 
    private JPanel fragePanel;
    private JPanel auswertungsPanel;
    private JPanel viewPanel;
    
    private JPanel root;
    private JFrame f;
    
    private JPanel main;
    private CardLayout cardLayout;
 
//KONSTRUKTOREN    
    
    /**
     * Constructor for objects of class CardProblem
     */
    public CardProblem()
    {
        init();
        
        f = new JFrame("CardProblem");
        f.add(root);
        f.pack();
        f.setVisible(true);
    }
    
//METHODEN
    
    public void init()
    {
        main = new JPanel();
        cardLayout = new CardLayout();
        main.setLayout(cardLayout);
        
        fragePanel = new JPanel();
        fragePanel.add(new JLabel("Eine Frage"));
        main.add(fragePanel, "Frage");
        
        auswertungsPanel = new JPanel();
        auswertungsPanel.add(new JLabel("Auswertung"));
        main.add(auswertungsPanel, "Auswertung");
        
        viewPanel = new JPanel();
        viewPanel.add(new JLabel("noch leer"));
        main.add(viewPanel, "ViewPanel");
        
        root = new JPanel();
        root.setLayout(new BorderLayout());
        
        JScrollPane sP = new JScrollPane();
        sP.setViewportView(main);
        
        root.add(sP, BorderLayout.CENTER);
        
        JPanel buttonPanel = new JPanel();
        
        JButton frage = new JButton("Frage");
        frage.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                cardLayout.show(main, "Frage");
                f.pack();
            }
            
        });
        buttonPanel.add(frage);
        
        JButton auswertung = new JButton("Auswertung");
        auswertung.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                cardLayout.show(main, "Auswertung");
                f.pack();
            }
            
        });
        buttonPanel.add(auswertung);
        
        JButton view = new JButton("ViewPanel");
        view.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                generateData();
                cardLayout.show(main, "ViewPanel");
                f.pack();
            }
            
        });
        buttonPanel.add(view);
        
        root.add(buttonPanel, BorderLayout.SOUTH);
    }
    
    /**
     * Generiert den Inhalt
     */
    private void generateData()
    {
         viewPanel.removeAll();
         viewPanel.setPreferredSize(new java.awt.Dimension(100,200));
         String tmp = "<html>";
         
         for(int i = 0; i < 500; i++)
         {
             tmp += "INHALT<br>";
         }
         
         tmp += "</html>";
         viewPanel.add(new JLabel(tmp));
    }
 
}//class close
 

Marco13

Top Contributor
Die PreferredSize vom ViewPanel zu setzen macht keinen Sinn, wenn das automatisch die passende Größe und ScrollBalken haben soll.

Die PreferredSize von der Component mit dem CardLayout ist das Maximum aller enthaltenen Components.

Ggf. müßtest du genauer sagen, welche Component wie groß sein soll, oder wie groß der Frame bei den jeweiligen Anzeigen sein soll....
 

Dragonfire

Bekanntes Mitglied
Ok,
eine komplizierte Lösung wäre dann eine Verwaltung der Größe
oder wie ich es im folgenden Beispiel gemacht habe,
dass größte Panel einfach auf 0x0 setzen
(vielleicht nicht unbedingt in jedem ActionListener,
aber jetzt der einfacher halber...)

Java:
package gerhardtComponent;
 
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import java.awt.CardLayout;
import java.awt.BorderLayout;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class CardProblem
{
//DATENFELDER
 
    private JPanel fragePanel;
    private JPanel auswertungsPanel;
    private JPanel viewPanel;
    
    private JPanel root;
    private JFrame f;
    
    private JPanel main;
    private CardLayout cardLayout;
 
//KONSTRUKTOREN    
    
    /**
     * Constructor for objects of class CardProblem
     */
    public CardProblem()
    {
        init();
        
        f = new JFrame("CardProblem");
        f.add(root);
        f.pack();
        f.setVisible(true);
    }
    
//METHODEN
    
    public void init()
    {
        main = new JPanel();
        cardLayout = new CardLayout();
        main.setLayout(cardLayout);
        
        fragePanel = new JPanel();
        fragePanel.add(new JLabel("Eine Frage"));
        main.add(fragePanel, "Frage");
        
        auswertungsPanel = new JPanel();
        auswertungsPanel.add(new JLabel("Auswertung"));
        main.add(auswertungsPanel, "Auswertung");
        
        viewPanel = new JPanel();
        viewPanel.add(new JLabel("noch leer"));
        main.add(viewPanel, "ViewPanel");
        
        root = new JPanel();
        root.setLayout(new BorderLayout());
        
        JScrollPane sP = new JScrollPane();
        sP.setViewportView(main);
        
        root.add(sP, BorderLayout.CENTER);
        
        JPanel buttonPanel = new JPanel();
        
        JButton frage = new JButton("Frage");
        frage.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                viewPanel.setPreferredSize(new java.awt.Dimension(0,0));
                cardLayout.show(main, "Frage");
                f.pack();
            }
            
        });
        buttonPanel.add(frage);
        
        JButton auswertung = new JButton("Auswertung");
        auswertung.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                viewPanel.setPreferredSize(new java.awt.Dimension(0,0));
                cardLayout.show(main, "Auswertung");
                f.pack();
            }
            
        });
        buttonPanel.add(auswertung);
        
        JButton view = new JButton("ViewPanel");
        view.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                generateData();
                cardLayout.show(main, "ViewPanel");
                f.pack();
            }
            
        });
        buttonPanel.add(view);
        
        root.add(buttonPanel, BorderLayout.SOUTH);
    }
    
    /**
     * Generiert den Inhalt
     */
    private void generateData()
    {
         viewPanel.removeAll();
         viewPanel.setPreferredSize(null);
         String tmp = "<html>";
         
         for(int i = 0; i < 500; i++)
         {
             tmp += "INHALT<br>";
         }
         
         tmp += "</html>";
         viewPanel.add(new JLabel(tmp));
    }
 
}//class close

Im Originalprogramm hab ich das wie oben beschrieben gelöst.

Einfach das ViewPanel aus dem CardLayout herausgenommen,
und das Panel mit dem CardLayout(main) gegen das ViewPanel getauscht.

(removeAll und dann add)
So gehts auch ;)

Ich glaube jetzt hab ich das CardLayout besser verstanden,
auf das manuelle setzten der Größe wäre ich jetzt irgendwie nicht gekommen.
Manchmal sieht man den Wald vor lauter Bäume nicht mehr.

Danke nochmal :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Von Menü: Seite zu Seite springen (CardLayout) AWT, Swing, JavaFX & SWT 8
H CardLayout beschränken AWT, Swing, JavaFX & SWT 2
P CardLayout funktioniert fehlerhaft AWT, Swing, JavaFX & SWT 13
L Java- CardLayout AWT, Swing, JavaFX & SWT 10
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
A Swing CardLayout - kein Wechsel möglich AWT, Swing, JavaFX & SWT 5
J CardLayout AWT, Swing, JavaFX & SWT 3
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
padde479 LayoutManager CardLayout wechselt die Karten nicht AWT, Swing, JavaFX & SWT 5
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
D Panel wird nicht angezeigt und Fragen zum CardLayout AWT, Swing, JavaFX & SWT 6
F CardLayout.show() funktioniert teilweise nicht AWT, Swing, JavaFX & SWT 5
F Swing Cardlayout aufräumen AWT, Swing, JavaFX & SWT 4
U CardLayout im Applet AWT, Swing, JavaFX & SWT 4
Q CardLayout und Klassenmethodenzugriff AWT, Swing, JavaFX & SWT 11
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
C Swing CardLayout dynamisch erweitern AWT, Swing, JavaFX & SWT 11
H cardlayout und jscrollpane AWT, Swing, JavaFX & SWT 14
C CardLayout in BorderLayout? AWT, Swing, JavaFX & SWT 36
W Swing Probleme mit CardLayout AWT, Swing, JavaFX & SWT 28
D JMenuBar - CardLayout (Klasse anzeigen) AWT, Swing, JavaFX & SWT 3
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
S LayoutManager Card des CardLayout mit MenuItem auswaehlen AWT, Swing, JavaFX & SWT 9
B RootPane bzw CardLayout Transparent machen AWT, Swing, JavaFX & SWT 7
L CardLayout - Show klappt nicht AWT, Swing, JavaFX & SWT 7
D Richtige implimentierung eines CardLayout AWT, Swing, JavaFX & SWT 3
P CardLayout - Anzeigeproblem AWT, Swing, JavaFX & SWT 2
I LayoutManager CardLayout mit anonymen Components AWT, Swing, JavaFX & SWT 4
Private Void LayoutManager Cardwechsel im CardLayout auch von Card aus? AWT, Swing, JavaFX & SWT 6
E LayoutManager Erster Versuch mit Cardlayout AWT, Swing, JavaFX & SWT 2
hdi LayoutManager Problem mit CardLayout AWT, Swing, JavaFX & SWT 11
C Problem mit CardLayout :( AWT, Swing, JavaFX & SWT 10
klattiator CardLayout - Cards auf Existenz prüfen AWT, Swing, JavaFX & SWT 3
S Frage/Problem CardLayout AWT, Swing, JavaFX & SWT 2
H CardLayout - Card erstellen hinzufügen usw. bis MI (12.3.) AWT, Swing, JavaFX & SWT 2
F CardLayout.show() -> NullPointerException AWT, Swing, JavaFX & SWT 4
G CARDLAYOUT AWT, Swing, JavaFX & SWT 2
D GroupLayout an un plötzlich is CardLayout Funktion tot? AWT, Swing, JavaFX & SWT 10
J CardLayout AWT, Swing, JavaFX & SWT 10
J CardLayout AWT, Swing, JavaFX & SWT 2
J Hilfe CardLayout AWT, Swing, JavaFX & SWT 3
H Cardlayout AWT, Swing, JavaFX & SWT 3
M CardLayout: Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Dialogfenster wird nicht aktualisiert/CardLayout AWT, Swing, JavaFX & SWT 6
m@nu StackOverflowError mit CardLayout? AWT, Swing, JavaFX & SWT 2
R CardLayout bei einem Quiz AWT, Swing, JavaFX & SWT 9
J Designfehler beim CardLayout() AWT, Swing, JavaFX & SWT 4
S Registerkarte mit CardLayout (AWT) erstellen ? AWT, Swing, JavaFX & SWT 6
D CardLayout Plus ? AWT, Swing, JavaFX & SWT 4
T CardLayout Ohne Cards/Reiter AWT, Swing, JavaFX & SWT 2
S SWT Maximum an Items in Table? AWT, Swing, JavaFX & SWT 2
L JavaFX Canvas max size? AWT, Swing, JavaFX & SWT 1
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
F GWT Screen size AWT, Swing, JavaFX & SWT 2
H preferred size abhängig von Fenstergröße berechnen AWT, Swing, JavaFX & SWT 11
M Font Size in FormsEditor AWT, Swing, JavaFX & SWT 2
N Richtiges einstellen der size von JPanels AWT, Swing, JavaFX & SWT 10
S jTable size und Text darstellung AWT, Swing, JavaFX & SWT 2
1 Swing manual resize table column to min size AWT, Swing, JavaFX & SWT 2
E Jlable text an size scalieren AWT, Swing, JavaFX & SWT 6
G JOptionPane.showConfirmDialog size problem AWT, Swing, JavaFX & SWT 3
A Swing Frame-Size / JButton AWT, Swing, JavaFX & SWT 19
B SWT Problem mit Alignment/Size AWT, Swing, JavaFX & SWT 3
R Container Size Problem AWT, Swing, JavaFX & SWT 5
S JPanel ohne Size AWT, Swing, JavaFX & SWT 7
F JComboBox Size AWT, Swing, JavaFX & SWT 2
E Problem mit JPanel - Wann wird size berechnet? AWT, Swing, JavaFX & SWT 5
G JPanel immer max-size öffnen. Wie? AWT, Swing, JavaFX & SWT 9
O JFrame und Size der Komponenten AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben