# Anfänger: Panel bei Button Klick anzeigen?



## bernostern (16. Nov 2006)

Hallo,

also ich stell mich hier an... unglaublich.

Ich hab mal eine möglichst kurzen Code, um zu zeigen, was ich will. Eigentlich dachte ich es ist ganz einfach. Ich möchte beim Klick auf einen Button einfach ein weiteres Panel anzeigen bzw. neu erzeugen. Das Panel soll sich dann innerhalb eines anderen Panels befinden.

```
package de.gui;


public class MainJFrame extends javax.swing.JFrame {

	
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JPanel jPanel1;
    
    private myJPanel jp;


	    public MainJFrame() {
	        initComponents();
	    }

	    private void initComponents() {
	        jPanel1 = new javax.swing.JPanel();
	        jButton1 = new javax.swing.JButton();
	        
	        jButton1.setText("jButton1");
	        jButton1.addActionListener(new java.awt.event.ActionListener() {
	            public void actionPerformed(java.awt.event.ActionEvent evt) {
	                jButton1ActionPerformed(evt);
	            }
	        });

	        	// Layout Zeug weggelassen //
	        
	        
	        pack();
	    }                        

	    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {  
	    	jp = new myJPanel();  
	        jp.setVisible(true);
	        jPanel1.add(jp); // innerhalb dieses jPanel1 hätte ich gern das neue...
	    }                                        

	    public static void main(String args[]) {
	        java.awt.EventQueue.invokeLater(new Runnable() {
	            public void run() {
	                new MainJFrame().setVisible(true);
	            }
	        });
	    }
	    
	    
}
```

Es kann jetzt sein, dass ich irgendwo etwas vergessen habe, aber es soll ja nur Beispiel-Code sein. Das Panel wird nie angezeigt, ich weiß nicht was fehlt (revalidate, repaint...?).
Oder ist der ganze Ansatz völlig falsch? 

Da es später so sein soll, dass man bei bestimmten Events immer ein neues Panel bekommt, würde ich das Panel gern erst erzeugen, wenn es wirklich gebraucht wird, also nicht mit setVisible() usw. die Panels durchschalten.

Danke fürs Licht im Dunkel!

Bern


----------



## André Uhres (17. Nov 2006)

Versuch's mit validate():

```
package gui;
/*
 * MainJFrame.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainJFrame extends JFrame {
    private JButton btAdd;
    private JPanel mainPanel;
    private JPanel jp;
    public MainJFrame() {
        super("MainJFrame");
        mainPanel = new JPanel();
        btAdd = new JButton();
        btAdd.setText("Add");
        btAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                btAddActionPerformed(evt);
            }
        });
        add(btAdd, BorderLayout.NORTH);
        add(mainPanel);
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    private void btAddActionPerformed(ActionEvent evt) {
        jp = new JPanel();
        jp.add(new JLabel("jp"));
        mainPanel.add(jp);
        validate();
    }
    public static void main(String args[]) {new MainJFrame().setVisible(true);}
}
```


----------



## Guest (18. Nov 2006)

Hallo,

erst einmal danke für deinen Tip!

Mit deinem Code gehts, mit meinem nach wie vor nicht. Anscheinend hab ich da Probleme mit dem ganzen Layout Zeugs. Das hat man davon, wenn man es nicht selber macht sondern mit Hilfe eines GUI Designers :-(

Hab jetzt mal den ganzen Frame inkl. Layout Code drangehängt. Wer Lust hat kann gerne mal drüberschaun. Ich werd jetzt auch weitersuchen.


```
package de.guitest;

// eigentlich keine imports notwendig, da 
// swing-layout-1.0.jar miteingepackt wird.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;



public class frmOptionsUI extends javax.swing.JFrame {
	
	
	private static final long serialVersionUID = 1L;
    
	private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane pnlScrollDetail;
    private javax.swing.JTree treeOptions;

//  diese von JPanel abgeleitete Klasse soll bei 
//  Buttonklick in dem pnlScrollDetail-JScrollPane 
//  angezeigt werden
    private prmEntityJstateUI p;  
	

    public frmOptionsUI() {
        initComponents();
    }
 
    private void initComponents() {
    	
    	jScrollPane1 = new javax.swing.JScrollPane();
        treeOptions = new javax.swing.JTree();
        pnlScrollDetail = new javax.swing.JScrollPane();
        jButton1 = new javax.swing.JButton();
        
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
        treeOptions.setCellRenderer(treeOptions.getCellRenderer());
        jScrollPane1.setViewportView(treeOptions);
        
              
        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 191, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jButton1))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(pnlScrollDetail, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 486, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(18, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 444, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jButton1))
                    .add(pnlScrollDetail, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE))
                .addContainerGap())
        );
        pack();
    }                     

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {     
    	// später soll bei Auswahl eines best. Eintrags im JTree
    	// dann das entsprechende Panel erzeugt und angezeigt werden
    	// Anzeige per Button-Klick momentan nur zum Test.
    	p = new prmEntityJstateUI();
        pnlScrollDetail.add(p);
        validate();

    }                                        
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new frmOptionsUI().setVisible(true);
            }
        });
    }
    
}
```


Schöne Grüße,
Bern


----------



## André Uhres (18. Nov 2006)

```
...
    private JPanel pnlScrollDetail;
...
        pnlScrollDetail = new JPanel();
...
```


----------



## Guest (18. Nov 2006)

OMG danke :roll: !
Jetzt klappts natürlich.


----------

