CardLayout - Show klappt nicht

Luciferius

Mitglied
Hallo an alle,

Ich habe ein Problem mit dem CardLayout. Ich schaffe mir eine Matrix von Panels mit CardLayout, die ich in ein höheres Panel einbette. Dann lege ich wie üblich ein Panel und ein Label auf das CardLayout. Zu einem späteren Zeitpunkt möchte ich nun diese mit der show-Funktion wild aufrufen können. Es passiert jedoch nichts und mit nichts mein ich nichts. Keine Fehlermeldung, keine Reaktion, kein Garnichts. Im folgenden nur der Quellcode, jedoch nur in Ausschnitten, da der vollständige Code wohl die maximale Länge des Beitrag überschreiten würde:

Java:
class Frame1 extends JFrame{
	
	private JPanel[][] panels;
	private JLabel[][] values;
	private JPanel[][] candidatePanels;
	private CardLayout cl;
	private GridBagLayout gbl;
	private final String val ="Value";
	
	[...]

	private JPanel newSudokuPanel() {
		cl = new CardLayout();						
		gbl = new GridBagLayout();					
		[...]
	}

	[...]

	private void getPanels() {
		panels = new JPanel[9][9];						
		Dimension d = new Dimension(50,50);				
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++){
				panels[i][j]=new JPanel(cl);
				panels[i][j].setPreferredSize(d);
				panels[i][j].setBorder(new LineBorder(Color.black));
			}
		
		values = new JLabel[9][9];
		
		candidatePanels = new JPanel[9][9];
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++){
				candidatePanels[i][j]=new JPanel(gbl);						
				candidatePanels[i][j].setBackground(Color.white);
			}
		
		[...]
	}

	[...]
	
	public void fillWithSudoku(int[][] sudoku){
		for(int i=0;i<sudoku.length;i++)
			for(int j=0;j<sudoku.length;j++){
				if(sudoku[i][j]!=0){
					makeStaticField(i,j,sudoku[i][j]);
					continue;
				}
				makedynamicField(i,j);
			}
	}
	
	private void makedynamicField(int y, int x) {
		panels[y][x].addMouseListener((MouseListener) al);
		panels[y][x].addFocusListener((FocusListener) al);
		panels[y][x].addKeyListener((KeyListener) al);
		panels[y][x].setBackground(Color.white);
		values[y][x] = new JLabel("",JLabel.CENTER);
		values[y][x].setFont(new Font("test",Font.BOLD,25));
		values[y][x].setForeground(Color.blue);
		panels[y][x].add(candidatePanels[y][x],"Candidate");
		panels[y][x].add(val,values[y][x]);
		cl.show(panels[0][1],"Value");
	}

	private void makeStaticField(int y, int x, int k) {
		JLabel staticField = new JLabel(String.valueOf(k),JLabel.CENTER);
		staticField.setFont(new Font("test",Font.BOLD,25));
		panels[y][x].add(staticField,"Value");
	}
	
	public void changeVC(JPanel panel){
		System.out.println("as");
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++)
				if(panel.equals(panels[i][j])){
 //an dieser Stelle passiert nichts:
					cl.show(panels[i][j],"");
					System.out.println("jaaaaaaa");
				}
	}

	[...]
}
 
Es tritt ein ähnlicher Fehler auf. Hier erstmal der KSKB:
Java:
import java.awt.*;

import javax.swing.*;
import javax.swing.border.LineBorder;

class KSKB extends JFrame{
	private JPanel mainPanel;
	private GridBagLayout gbl;
	private CardLayout cl;
	private JPanel[][] panels;
	private JLabel[][] values;
	private JPanel[][] candidatePanels;
	
	public KSKB(){
		gbl=new GridBagLayout();
		cl=new CardLayout();
		mainPanel = new JPanel(gbl);
		this.setContentPane(mainPanel);
		this.setSize(400,400);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);		
		panels = new JPanel[9][9];
		values = new JLabel[9][9];
		candidatePanels = new JPanel[9][9];
		
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++){
				panels[i][j]=new JPanel(cl);
				panels[i][j].setBorder(new LineBorder(Color.black));
				
				values[i][j]=new JLabel("");							
				values[i][j].setBackground(Color.white);
				values[i][j].setOpaque(true);
				panels[i][j].add(values[i][j],"Values");
				
				candidatePanels[i][j]=new JPanel(gbl);							
				panels[i][j].add(candidatePanels[i][j],"Candidate");
				
				addComponent(mainPanel,gbl,panels[i][j],i,j,1,1,1.0,1.0);
			}
		//Hier der fehlerhafte Code
		cl.show(panels[0][1], "Candidate");
	}
	
	public static void main(String...args){
		KSKB kskb = new KSKB();
		kskb.setVisible(true);
	}
	
	static void addComponent(Container cont,GridBagLayout gbl,Component c,int x, int y,
			 int width, int height,double weightx, double weighty ){ 
		GridBagConstraints gbc = new GridBagConstraints(); 
		gbc.fill = GridBagConstraints.BOTH; 
		gbc.gridx = x; gbc.gridy = y; 
		gbc.gridwidth = width; gbc.gridheight = height; 
		gbc.weightx = weightx; gbc.weighty = weighty; 
		gbl.setConstraints( c, gbc ); 
		cont.add( c ); 
	} 
}

Egal was ich als werte bei panels[x][y] einsetzte es ändern sich nur panels[8][8] auf die contentPanels
 
Zuletzt bearbeitet:
Ich würde noch ein par Listen und Maps einbauen, dass es auch schön kompliziert wird 😉...
Wie wärs wennd u es ersteinmal mit einem JPanel und CardLayout versuchst???
Du kannst nicht 10 JPanels immer die gleiche Instanz von dem CardLayout geben. Ich versteh gar net was du vor hast...

1 CardPanel kann n cards aufnehmen fertig.
 
Das ganze soll ein Sudoku werden, wo man die Zahlen eintragen kann (in die Labels), aber auch Kandidaten (die JPanels). Zwischen beiden muss ich natürlich wechseln können und die Daten im Endeffekt auch auswerten können, daher ist alles in einer Matrix gespeichert. Ich find es einfach elegant, dass ganze mit einem Cardlayout zu lösen, statt mit einem JLabel immer irgendwie die Schriftgrößen und Anordnungen rumzumogeln. Was meinst du mit den gleichen Instanzen bei CardLayout? Wenn du damit den "Erkennungsstring" meinst, wieso muss ich dann bei show() überhaupt den Parent-Container angeben, wenn das Layout mit gleichen "Erkennungsstrings" gar nicht klarkommt?
 
Hallo Luciferius,

wie SirWayne schon sagte, legst du nur ein einziges CardLayout an:
Java:
cl=new CardLayout();
Dieses benutzt du dann für alle 81 Panels:
Java:
panels[i][j]=new JPanel(cl);
Es ist daher normal, dass nur das letzte Panel reagiert.

Bei 81 Panels mit Cardlayout müssen wir für jedes einzelne Panel ein neues CardLayout erzeugen (also jeweils mit "new CardLayout()" ).

Gruß,
André

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

class KSKB extends JFrame {

    private JPanel mainPanel;
    private GridBagLayout gbl;
    private JPanel[][] panels;
    private JLabel[][] values;
    private JPanel[][] candidatePanels;

    public KSKB() {
        gbl = new GridBagLayout();
        mainPanel = new JPanel(gbl);
        this.setContentPane(mainPanel);
        this.setSize(400, 400);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        panels = new JPanel[9][9];
        values = new JLabel[9][9];
        candidatePanels = new JPanel[9][9];

        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                panels[i][j] = new JPanel(new CardLayout());
                panels[i][j].setBorder(new LineBorder(Color.black));

                values[i][j] = new JLabel("");
                values[i][j].setBackground(Color.white);
                values[i][j].setOpaque(true);
                panels[i][j].add(values[i][j], "Values");

                candidatePanels[i][j] = new JPanel(gbl);
                candidatePanels[i][j].add(new JLabel(i + "," + j));
                panels[i][j].add(candidatePanels[i][j], "Candidate");

                addComponent(mainPanel, gbl, panels[i][j], i, j, 1, 1, 1.0, 1.0);
            }
        }
        CardLayout cl = (CardLayout) panels[0][1].getLayout();
        cl.show(panels[0][1], "Candidate");
    }

    public static void main(String... args) {
        KSKB kskb = new KSKB();
        kskb.setVisible(true);
    }

    static void addComponent(Container cont, GridBagLayout gbl, Component c, int x, int y,
            int width, int height, double weightx, double weighty) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        gbl.setConstraints(c, gbc);
        cont.add(c);
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben