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:
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ü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");
}
}
}