LayoutManager CardLayout wechselt die Karten nicht

padde479

Bekanntes Mitglied
Hallo,

ich habe einen Frame mit einer SplitPane erstellt. Im linken Bereich habe ich einen JTree erzeugt, im rechten Bereich ein JPanel mit einem CardLayout. Allerdings gelingt der Wechsel der JPanel nicht. Je nachdem, ob ich im Baum eine Wurzel oder ein Blatt anwähle, soll das jeweilige JPanel angezeigt werden. Kann vielleicht jemand helfen? Hier der zugehörige Code:

Java:
package de.my.company.dlg;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

import de.my.company.db.DBConnection;
import de.my.company.gpr.Prozess;
import de.my.company.gpr.ProzessDB;
import de.my.company.gpr.ProzessDetailPanel;
import de.my.company.gpr.ProzessOverviewPanel;
import de.my.company.util.Messages;
import net.miginfocom.swing.MigLayout;
import java.awt.CardLayout;
import javax.swing.ImageIcon;

public class ProzessDesignerDialog extends JFrame implements TreeSelectionListener {

    /** */
    private static final long serialVersionUID = -8845709130071603788L;
    private JPanel contentPane;
    /** a return status code - returned if OK button has been pressed */
    private static final int RET_OK = 0;
    /** a return status code - returned if CANCEL button has been pressed */
    private static final int RET_CANCEL = 1;
 
    private int returnStatus = RET_CANCEL;
 
    private JPanel cards;
    private ProzessOverviewPanel card1;
    private ProzessDetailPanel card2;
    private JScrollPane treeScrollPane;
    private JTree tree;
 
    private DefaultMutableTreeNode root;
    private DefaultMutableTreeNode prozesse;

    /**
    * Create the frame.
    */
    public ProzessDesignerDialog() {
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new MigLayout("", "[grow][][]", "[][grow][]"));
     
        JLabel lblNewLabel = new JLabel(Messages.getString("service.program.prozess.label"));
        lblNewLabel.setOpaque(true);
        lblNewLabel.setFont(new Font("Lucida Grande", Font.BOLD, 20));
        lblNewLabel.setForeground(Color.WHITE);
        lblNewLabel.setBackground(Color.GRAY);
        contentPane.add(lblNewLabel, "cell 0 0 3 1,growx");
     
        JSplitPane splitPane = new JSplitPane();
        splitPane.setDividerLocation(400);
        contentPane.add(splitPane, "cell 0 1 3 1,grow");
     
        root = new DefaultMutableTreeNode("Root");
        prozesse = new DefaultMutableTreeNode("Prozesse");
        List<Prozess> list = ProzessDB.getProzessList(new DBConnection());
        for (Prozess gpr : list) {
            prozesse.add(new DefaultMutableTreeNode(gpr.getGprProzessInformation()));
        }
        root.add(prozesse);
     
        tree = new JTree(root);
        tree.addTreeSelectionListener(this);
        tree.setRootVisible(Boolean.FALSE);
        treeScrollPane = new JScrollPane(tree);
        splitPane.setLeftComponent(treeScrollPane);
     
        cards = new JPanel(new CardLayout());
        // create the cards
        card1 = new GeschaeftsprozessOverviewPanel();
        card2 = new GeschaeftsprozessDetailPanel();
        card1.setName("de.my.company.gpr.ProzessOverviewPanel");
       card2.setName("de.my.company.gpr.ProzessDetailPanel");
        cards.add(card1);
        cards.add(card2);
        // DEBUG-Ausgabe
        System.out.format("Name ProzessOverviewPanel: %s%n", card1.getName());
        System.out.format("Name ProzessDetaiPanel: %s%n", card2.getName());
        splitPane.setRightComponent(cards);
     
     
        JButton btnOk = new JButton("");
        btnOk.setIcon(new ImageIcon(ProzessDesignerDialog.class.getResource("/de/my/company/res/dialog-ok16.png")));
        btnOk.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                doClose(RET_OK);
            }
        });
        contentPane.add(btnOk, "cell 1 2");
     
        JButton btnCancel = new JButton("");
        btnCancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                doClose(RET_CANCEL);
            }
        });
        contentPane.add(btnCancel, "cell 2 2");
     
        /* close the dialog when ESC is pressed */
        String cancelName = "cancel";
        InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), cancelName);
        ActionMap actionMap = getRootPane().getActionMap();
        actionMap.put(cancelName, new AbstractAction() {
            private static final long serialVersionUID = -1258953610030108532L;
            @Override
            public void actionPerformed(ActionEvent e) {
                doClose(RET_CANCEL);
            }
        });
    }
 
    /**
    * Liefert den Statuscode zur&uuml;ck.
    * @return
    */
    public int getReturnStatus() {
        return returnStatus;
    }
 
    private void doClose(int retStatus) {
        returnStatus = retStatus;
        setVisible(Boolean.FALSE);
        dispose();
    }
 
    @Override
    public void valueChanged(TreeSelectionEvent e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
     
        if (node == null)
            return;
     
        Object nodeInfo = node.getUserObject();
        CardLayout cardLayout = (CardLayout)(cards.getLayout());
        if (node.isLeaf()) {
            System.out.format("IF geklickt: %s%n", nodeInfo);
            cardLayout.show(cards, "de.my.company.gpr.ProzessDetailPanel");
        } else {
            System.out.format("ELSE geklickt: %s%n", nodeInfo);
            cardLayout.show(cards, "de.my.company.gpr.ProzessOverviewPanel");
        }
    }

}
 

Enceladus271

Bekanntes Mitglied
Der Name muss als Constraint übergeben werden:
Java:
cards.add(card1, "de.my.company.gpr.ProzessOverviewPanel");
cards.add(card2, "de.my.company.gpr.ProzessDetailPanel");
Das setName brauchst du nicht.
 

javampir

Bekanntes Mitglied
hi,
ich weiß nicht, ob das einen unterschied macht, aber das adden der cards wird auf https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html
anders gemacht. es gibt kein setName, sondern es wird in der add-Methode als zweiter parameter der string übergeben.
außerdem würde ich die strings in globalen konstanten speichern oder die gleiche referenz übergeben, vielleicht gibt es intern schwierigkeiten mit dem stringvergleich; außerdem beugst du so tippfehler vor.
javampir
 

padde479

Bekanntes Mitglied
Danke euch beiden, aber irgendwie will das nicht klappen. Ich mal ein Minimalbeispiel erstellt:

Java:
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Font;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

import net.miginfocom.swing.MigLayout;

public class ContentPanel extends JPanel implements TreeSelectionListener {
   
    private JPanel parent;
    private JTree tree;
 
    private JPanel card1;
    private JPanel card2;

    /**
     * Create the panel.
     */
    public ContentPanel() {
        setLayout(new MigLayout("", "[grow]", "[][grow]"));
       
        JLabel lblTitel = new JLabel("New label");
        lblTitel.setOpaque(true);
        lblTitel.setForeground(Color.WHITE);
        lblTitel.setBackground(Color.LIGHT_GRAY);
        lblTitel.setFont(new Font("Tahoma", Font.BOLD, 20));
        add(lblTitel, "cell 0 0,growx");
       
        JSplitPane splitPane = new JSplitPane();
        add(splitPane, "cell 0 1,grow");
       
        tree = new JTree();
        tree.addTreeSelectionListener(this);
        splitPane.setLeftComponent(tree);
       
        card1 = new JPanel(); 
        card2 = new JPanel();
        parent = new JPanel(new CardLayout());
        parent.add(card1, "Karte1");
        parent.add(card2, "Karte2");
        splitPane.setRightComponent(parent);
       

    }
   
    @Override
    public void valueChanged(TreeSelectionEvent e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
       
        if (node == null)
            return;
        CardLayout cardLayout = (CardLayout)parent.getLayout();
        if (node.isLeaf()) {
            cardLayout.show(card1, "Karte1");
        } else {
            cardLayout.show(card2, "Karte2");
        }
    }
}

Wenn ich das jetzt ausführe, erhalte ich

Code:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: wrong parent for CardLayout
    at java.awt.CardLayout.checkLayout(Unknown Source)
    at java.awt.CardLayout.show(Unknown Source)
    at de.online.nv.winsure.produkt.designer.ContentPanel.valueChanged(ContentPanel.java:78)
    at javax.swing.JTree.fireValueChanged(Unknown Source)

Keine Ahnung wieso?!
 

Enceladus271

Bekanntes Mitglied
Bei show muss die Komponente angegeben werden die die Card anzeigen soll. Also
Java:
cardLayout.show(parent, "Karte1");
 
Ä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
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
Dragonfire Swing CardLayout Maximum Size AWT, Swing, JavaFX & SWT 7
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
D JInternalFrame wechselt Position beim ersten Click AWT, Swing, JavaFX & SWT 0
N JFileChooser wechselt Farbe (grün statt blau) AWT, Swing, JavaFX & SWT 3
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
B Swing JXMapkit OSM Karten offline Nutzen AWT, Swing, JavaFX & SWT 0
P SWT Karten überlappen AWT, Swing, JavaFX & SWT 2
S Welche Komponenten für Karten eines Kartenspiels AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben