# import von Klassen (zwei Panels eine Form)



## sohell (3. Sep 2009)

Hallo ich möchte ein Fenster erstellen, und zwei panels. das Fenster hat keine Komponenten, die zwei Panels haben zwei verschiedene Komponenten wie buttons und Textboxe. den Inhalt des Fensters möchte ich zur Laufzeit ändern. ich krieg das irgendwie nicht hin. 

hier der code:


```
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;


public class jFramev4 extends JFrame {
	public jFramev4() {
		initComponents();
	}

	private void initComponents() {
		
		CellConstraints cc = new CellConstraints();


		Container contentPane = getContentPane();
		contentPane.setLayout(new FormLayout(
			"default, $lcgap, default",
			"2*(default, $lgap), default"));
		setSize(400, 300);
		setLocationRelativeTo(null);

	}


	static jFramev4 frame1 = new jFramev4(); 
	public static void main (String [] args){
		 

		frame1.setVisible(true);

		jPanelv4 panelv4 = new jPanelv4(); 
		
		
	}
	
[COLOR="#ff0000"]	// jPanelv4 sollte hier die Komponenten wie textbox und buttons von jPanelv3 erhalten.[/COLOR]
		static class jPanelv4 extends jPanelv3{
		   public jPanelv4(){
		      
		      JOptionPane.showMessageDialog(null,"Endlich","mouseClicked", JOptionPane.INFORMATION_MESSAGE);
[COLOR="Red"]//hier sollte in frame1 die componenten mithilfe addComponents(panelv4) hinkommen[/COLOR]
// dazu dachte müsste man mit frame1.removeAll() alle komponenten löschen
// dann frame1.addComponents(jPanelv3) hinzufügen. aber geht nicht! 
			     }
		      };
	
}
```

der code verursacht nach frame1.removeAll() ein freeze. Fenster reagiert nicht mehr. 
Wohl weil noch zeiger auf einige Komponenten sind oder. Ich suche schon sehr lange
aber irgendwie komm ich mit allem nicht zurecht. stehe auch unter zeitdruck :autsch:


----------



## diggaa1984 (3. Sep 2009)

> den Inhalt des Fensters möchte ich zur Laufzeit ändern



klingt ein wenig nach CardLayout, aber so ganz schlau werde ich aus deiner beschreibung nicht


----------



## sohell (3. Sep 2009)

ja richtig wie cordlayout. aber ich möchte das layout von meinem Designer übernehmen. 

wie importiere ich denn die klassen meines java projektes? 
dann müssten doch alle elemente (buttons, textbox usw) sowie ihre einstellungen von der klasse übernommen werden?


----------



## sohell (3. Sep 2009)

und sobald ich eine instanz von der klasse anlege und diese der form hinzufüge, müssten die eigentlich genauso angezeigt werden, wie sie in der klasse definiert sind. 


```
import java.awt.Container;
import java.awt.event.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.*;
import java.awt.CardLayout;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
 

public class jFramev4 extends JFrame {
	public jFramev4() {
		initComponents();
	}

	private void initComponents() {
		// JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents
		textField1 = new JTextField();
		panel1 = new JPanel();
		button1 = new JButton();
		CellConstraints cc = new CellConstraints();

		//======== this ========
		Container contentPane = getContentPane();
		contentPane.setLayout(new FormLayout(
			"default, $lcgap, default:grow",
			"4*(default, $lgap), default"));
		contentPane.add(textField1, cc.xy(3, 3));

		//======== panel1 ========
		{
			panel1.setLayout(new FormLayout(
				"default, $lcgap, default",
				"2*(default, $lgap), default"));
		}
		contentPane.add(panel1, cc.xy(3, 5));

		//---- button1 ----
		button1.setText("text");
		button1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				button1MouseClicked(e);
			}
		});
		contentPane.add(button1, cc.xy(3, 9));
		setSize(400, 300);
		setLocationRelativeTo(null);
		// JFormDesigner - End of component initialization  //GEN-END:initComponents
	}

	// JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables
	private JTextField textField1;
	private JPanel panel1;
	private JButton button1;
	// JFormDesigner - End of variables declaration  //GEN-END:variables
	static jFramev4 frame1 = new jFramev4(); 
	 
	public static void main (String [] args){
		JOptionPane.showMessageDialog(null,"Endlich","mouseClicked", JOptionPane.INFORMATION_MESSAGE); // das hier wird auch angezeigt
		
        frame1.setVisible(true); 
	}

	private void button1MouseClicked(MouseEvent e) {
// das hier aber erzeugt ein fehler!         
frame1.add(new JButton("Button 2"));
        frame1.add(new JButton("Button 3"));
         validate(); 
        frame1.pack();
	}
}
```


----------



## diggaa1984 (3. Sep 2009)

zur laufzeit mit komponenten und layout rumspielen ist nich grad meine stärke, vielleicht weiss da jemand anderes was, ich löse das immer per cardLayout, warum genau willst du das nicht damit umsetzen, das habe ich nich verstanden ^^


----------



## sohell (3. Sep 2009)

bei cardlayout kann man nur bestimmen ob die textbox mittig, links, rechts usw. angeordnet werden kann. außerdem ist die gestaltung mit GUI designern einfacher.


----------



## diggaa1984 (3. Sep 2009)

hm ne das cardLayout ist dazu gedacht .. eine Menge von Cards zu erstellen welche dann einfach aktiviert werden. Die Cards selber sind wieder Komponenten wie zB. JPanels welche dann alles benötigte beinhalten. Die JPanels können ja dann bekanntermaßen andere Layouts beherbergen

hab grad mein source net da, sonst hätt ich dir schnell mal n bsp geben können
grob sollte das wie folgt gehen:

```
JFrame f = new JFrame();
CardLayout l = new CardLayout();
f.setLayoutr(l);

MyFirstView first = new MyFirstView(); //extends Component oder noch spezieller
l.addLayoutComponent(first,"first");

MySecondView second = new MySecondView(); //extends Component oder noch spezieller
l.addLayoutComponent(second,"second");
```
und dann kannst per

```
l.show(f,"first");
```
 die Karte anzeigen lassen .. GUI somit komplett ausgetauscht

und in den View-Klasse kannst alles an Layouts nutzen und anordnen wie du das möchtest


----------



## sohell (3. Sep 2009)

hey digga,

ich hab die funktionsweise von cordlayout verstanden. aber es ist folgendermaßen.
ich hab einen designer den jframe designer um meine gui mir zurecht zu klicken.
ich hab ein projekt mit mehreren jPanel klassen (jPane1 und jPanel2) und ein fenster (jFrame)
wieso kann ich in der klasse jFrame z.B. jPanel1 nicht anlegen. und diese zeigen lassen. dann wenn ich auf ein button klicke mittels eventhandler (mouseClick event) den anderen Panel (jPanel2) anzeigen lassen?

was mich an cordlayout stört ist das man im code dann nochmal angeben muss wo sich das Element (z.b. button, textbox usw) links, rechts oder so befinden soll. 

ich werde mal den cordlayout code von dir mal ausprobieren. sofort!


----------



## diggaa1984 (3. Sep 2009)

> wieso kann ich in der klasse jFrame z.B. jPanel1 nicht anlegen. und diese zeigen lassen. dann wenn ich auf ein button klicke mittels eventhandler (mouseClick event) den anderen Panel (jPanel2) anzeigen lassen?



da würde ich jetzt mal behaupten, dass es gehen müsste .. du addest beim erstellen des frames einfach diese instanzen der 2 panel-klassen dem cardlayout dazu. und was willst du da "links" "rechts" festlegen müssen, kann mich nicht dran erinnern, denn das JPanel wäre die einzige Komponente in dem Frame, welche sichtbar ist. Der Rest wird ja in der JPanel-Klasse geregelt.

zeig mal code wenn du soweit bist


----------



## eRaaaa (3. Sep 2009)

hä? du musst doch immer sagen wo er das jpanel hinzufügen soll?! 


```
JPanel cardPanel;
	public CardLayoutDemo() {
		setPreferredSize(new Dimension(200, 200));

		// main
		JPanel panel = new JPanel(new BorderLayout());

		// header
		JPanel header = new JPanel();
		JRadioButton a = new JRadioButton("Eins");
		a.addActionListener(this);
		JRadioButton b = new JRadioButton("Zwei");
		b.addActionListener(this);
		ButtonGroup group = new ButtonGroup();
		group.add(a);
		group.add(b);
		header.add(a);
		header.add(b);

		// Card
		cardPanel = new JPanel();
		cardPanel.setLayout(new CardLayout());

		JPanel eins = new JPanel();
		eins.add(new JLabel("Erstes Panel"));

		JPanel zwei = new JPanel();
		zwei.add(new JLabel("Zweites Panel"));
		
		
		cardPanel.add(eins, "Eins");
		cardPanel.add(zwei, "Zwei");

		panel.add(header, BorderLayout.NORTH);
		panel.add(cardPanel, BorderLayout.CENTER);
		add(panel);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		pack();
		setVisible(true);
	}

@Override
	public void actionPerformed(ActionEvent e) {
		CardLayout cl = (CardLayout)(cardPanel.getLayout());
		cl.show(cardPanel, e.getActionCommand());
	}
```

anstatt radiobuttons, kannst du ja auch benutzen was du willst...


----------



## sohell (3. Sep 2009)

```
private void button2MouseClicked(MouseEvent e) {
		JFrame f = new JFrame();
		CardLayout cL = new CardLayout();
		f.setLayout(cL);
		 
//		MyFirstView first = new MyFirstView(); //extends Component oder noch spezieller
//		l.addLayoutComponent(first,"first");
		JPanel jF = new JPanel(new CardLayout());
		cL.addLayoutComponent(jF, "first"); 
//		MySecondView second = new MySecondView(); //extends Component oder noch spezieller
//		l.addLayoutComponent(second,"second");
		JPanel jF2 = new JPanel(new CardLayout());
		cL.addLayoutComponent(jF2, "second");
		cL.show(f, "first");
	}
```

Fehlermeldung: wrong parent for CardLayout

eigentlich würde ich ja lieber meine eigenen panels nehmen, welche components / elements haben. 
aber da gibt er mir die selbe fehlermeldung


----------



## diggaa1984 (3. Sep 2009)

eRaaaa hat gesagt.:


> hä? du musst doch immer sagen wo er das jpanel hinzufügen soll?!



mir gings ja ohne den weg über ein mainPanel .. das hatte ich ja nich angenommen. Das Layout hatte ich ja direkt beim Frame gesetzt .. wie gesagt mein Source ist nicht da, hab angenommen das geht auch direkt aufm Frame


----------



## sohell (3. Sep 2009)

kann man nicht die panels nehmen die in meinem projekt sind? wenn doch die klasse global ist dann müsste ich doch in einer anderen klasse eine instanz anlegen können. kurz: ich will meine eigenen panels welche ich mit GUI designer vordefiniert hab. und nicht zur laufzeit noch irgendwie sagen das der button rechts, der andere links und so liegt. das kommt mir wie im mittelalter vor.


----------



## diggaa1984 (3. Sep 2009)

KSKB

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test {
	
	public static void main(String[] args) {
		final JFrame frame = new JFrame("CardTest");
		final CardLayout cl = new CardLayout();
		
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		frame.setLayout(cl);
		
		JButton b = new JButton("switch");
		b.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				cl.next(frame.getContentPane());
			}
		});
		
		JButton c = new JButton("switch");
		c.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				cl.next(frame.getContentPane());
			}
		});
		
		
		JPanel first = new JPanel();
		first.setBackground(Color.BLACK);
		first.setMinimumSize(new Dimension(200,200));
		first.add(b);
		
		JPanel second = new JPanel();
		second.setBackground(Color.YELLOW);
		second.setMinimumSize(new Dimension(200,200));
		second.add(c);

		frame.add(first,"first");
		frame.add(second,"second");
		
		cl.show(frame.getContentPane(),"first");
		
		frame.pack();
		frame.setVisible(true);
	}	
}
```
den buttonkram mal so hinnehmen, is auf die schnelle hingehackt .. nun brauchst du nur die JPanels first und second durch eigene Klasse ersetzen und voila, sollte gehen!? Man muss die Komponenten doch dem Frame adden, und nicht direkt dem Layout.


----------



## sohell (3. Sep 2009)

```
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

import com.jgoodies.forms.layout.*;

public class ersterFrame extends JFrame {
	public ersterFrame() {
		initComponents();
	}

	static void bMouseClicked(MouseEvent e) {
		 cl.next(frame.getContentPane());
		 JOptionPane.showMessageDialog(null,"endlich","mouseClicked", JOptionPane.INFORMATION_MESSAGE);  
	}

	private void initComponents() {
		
		button1 = new JButton();
		button2 = new JButton();
		CellConstraints cc = new CellConstraints();

		//======== this ========
		Container contentPane = getContentPane();
		contentPane.setLayout(new FormLayout(
			"5*(default, $lcgap), default",
			"5*(default, $lgap), default"));

		//---- button1 ----
		button1.setText("erster panel");
		contentPane.add(button1, cc.xy(11, 9));

		//---- button2 ----
		button2.setText("zweiter panel");
		contentPane.add(button2, cc.xy(11, 11));
		setSize(400, 300);
		setLocationRelativeTo(getOwner());
	}


	private JButton button1;
	private JButton button2;
	// JFormDesigner - End of variables declaration  //GEN-END:variables
	
	static final CardLayout cl = new CardLayout();
	static final JFrame frame = new JFrame("CardTest");
	static JPanel first = new JPanel();
	static JPanel second = new JPanel();
    public static void main(String[] args) {
       
        
        
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        
        frame.setLayout(cl);
        
        JButton b = new JButton("switch");
        b.addMouseListener(new MouseAdapter() {
            
            @Override
            public void mouseClicked(MouseEvent e) {
            	bMouseClicked(e);
            }
        });
        
        JButton c = new JButton("switch");
        b.addMouseListener(new MouseAdapter() {
            
            @Override
            public void mouseClicked(MouseEvent e) {
            	bMouseClicked(e);
            }
        });
        
        
        
        first.setBackground(Color.BLACK);
        first.setMinimumSize(new Dimension(200,200));
        first.add(b);
        
        
        second.setBackground(Color.YELLOW);
        second.setMinimumSize(new Dimension(200,200));
        second.add(c);
 
        frame.add(first,"first");
        frame.add(second,"second");
        
        cl.show(frame.getContentPane(),"first");
        
        frame.pack();
        frame.setVisible(true);
    }   
}
```

weis nicht warum aber anscheinend wird der eventhandler zwei mal aufgerufen. ich blick da nicht durch. denn klicken tu ich nur einmal. vielleicht schiesst dieses mouse event zwei mal ein ereignis. denn die messagebox und die farbänderung kommt zwei mal. 

wenn ich meine forms und panels nehme gehts immer noch nicht!! also habs mit meinen zwei panels versucht, welche components/elements (buttons usw) haben. 
dann erhalte ich die Fehlermeldung: The constraints must not be null.


----------



## diggaa1984 (4. Sep 2009)

```
public class ersterFrame extends JFrame {
	public ersterFrame() {
		initComponents();
	}

	static void bMouseClicked(MouseEvent e) {
		 cl.next(frame.getContentPane());
		 JOptionPane.showMessageDialog(null,"endlich","mouseClicked", JOptionPane.INFORMATION_MESSAGE);  
	}

	private void initComponents() {
		
		button1 = new JButton();
		button2 = new JButton();
		CellConstraints cc = new CellConstraints();

		//======== this ========
		Container contentPane = getContentPane();
		contentPane.setLayout(new FormLayout(
			"5*(default, $lcgap), default",
			"5*(default, $lgap), default"));

		//---- button1 ----
		button1.setText("erster panel");
		contentPane.add(button1, cc.xy(11, 9));

		//---- button2 ----
		button2.setText("zweiter panel");
		contentPane.add(button2, cc.xy(11, 11));
		setSize(400, 300);
		setLocationRelativeTo(getOwner());
	}


	private JButton button1;
	private JButton button2;
	// JFormDesigner - End of variables declaration  //GEN-END:variables
```

das ist im zuge dessen was du von mir kopiert hast ja irgendwie alles doppelt gemoppelt. weiter unten nutzt du genau das was ich geschrieben habe, was hat das da oben noch für ne verwendung, muss das FormLayout mit Annahme eines funktionierenden cardLayouts noch sein!?

edit: da zeigt sich mal wieder, das selber GUI proggen sehr viel besser ist, da du dann alles lernst was da passiert, hab mich auch selbst dazu gezwungen und geschadet hats nich ^^


----------



## sohell (4. Sep 2009)

hey ich versuche immernoch meine klassen zu verwenden deswegen füge ich dein code sie in meine eigene Klasse ein. und passe es an.

aber hier jetzt eine version die wieder die farbe nicht ändert! ich wollte ein eventhandler setzen welcher bei klick auf den button aufgerufen wird. 


```
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import com.jgoodies.forms.layout.*;
/*
 * Created by JFormDesigner on Fri Sep 04 11:30:54 CEST 2009
 */



/**
 * @author BLASTER STRIKE
 */
public class zweiterFrame2 extends JFrame {
	public zweiterFrame2() {
		initComponents();
	}

	private void initComponents() {
		// JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents
		CellConstraints cc = new CellConstraints();

		//======== this ========
		Container contentPane = getContentPane();
		contentPane.setLayout(new FormLayout(
			"default, $lcgap, default",
			"2*(default, $lgap), default"));
		pack();
		setLocationRelativeTo(getOwner());
		// JFormDesigner - End of component initialization  //GEN-END:initComponents
	}

	// JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables
	// JFormDesigner - End of variables declaration  //GEN-END:variables
	
    public static void main(String[] args) {
        final JFrame frame = new JFrame("CardTest");
        final CardLayout cl = new CardLayout();
        
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        
        frame.setLayout(cl);
        
        JButton b = new JButton("switch");
        b.addMouseListener(new MouseAdapter() {
            
            @Override
            public void mouseClicked(MouseEvent e) {
                cl.next(frame.getContentPane());
            }
        });
        
        JButton c = new JButton("switch");
        b.addMouseListener(new MouseAdapter() {
            
            @Override
            public void mouseClicked(MouseEvent e) {
                cl.next(frame.getContentPane());
            }
        });
        
        
        JPanel first = new JPanel();
        first.setBackground(Color.BLACK);
        first.setMinimumSize(new Dimension(200,200));
        first.add(b);
        
        JPanel second = new JPanel();
        second.setBackground(Color.YELLOW);
        second.setMinimumSize(new Dimension(200,200));
        second.add(c);
 
        frame.add(first,"first");
        frame.add(second,"second");
        
        cl.show(frame.getContentPane(),"first");
        
        frame.pack();
        frame.setVisible(true);
    }   

}
```

es wird wohl kein eventhandler aufgerufen.


----------



## Michael... (4. Sep 2009)

Verwende den richtigen Listener (ActionListener für Buttons) und schon funktioniert's. ;-) Und wenn Du nächstes Mal überflüssigen Code vor dem Posten rausschmeisst, wird's für Leute, die Dir helfen wollen auch einfacher.

```
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class zweiterFrame2 extends JFrame {
	public static void main(String[] args) {
		final JFrame frame = new JFrame("CardTest");
		final CardLayout cl = new CardLayout();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(cl);

		ActionListener listener = new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				cl.next(frame.getContentPane());
			}
		};

		JButton button = new JButton("switch");
		button.addActionListener(listener);

		JPanel panel = new JPanel();
		panel.setBackground(Color.BLACK);
		panel.add(button);

		frame.add(panel, "first");

		button = new JButton("switch");
		button.addActionListener(listener);
		panel = new JPanel();
		panel.setBackground(Color.YELLOW);
		panel.add(button);

		frame.add(panel, "second");

		cl.show(frame.getContentPane(), "first");

		frame.pack();
		frame.setVisible(true);
	}
}
```

PS Schieß doch den blöden GUI-Builder in den Wind


----------



## sohell (4. Sep 2009)

OMG :shock: es funktioniert. das beispiel funktioniert. geht aber nicht ganz in meine richtung. 

was für möglichkeiten hab ich bezüglich der layout-gestaltung bei codeprogrammierung? ich hab da schon was programmiert. ich habs so gemacht: ein button1, welche ein weiteres button2 der form hinzufügt. button1 soll dabei gehidet (hide()) werden. man soll jedesmal immer dabei pack() aufrufen um die form neu zu zeichnen...komischerweise wird bei pack() das fenster immer auf die optimale größe angepasst. Also welche sie für die existierenden elemente (button) braucht. d.h. fenstergröße = buttongröße.

wieso kann ich denn nicht einfach eine instanz von einem jPanel anlegen und es wird einfach der jFrom hinzugefügt. das ist doch das einfachste auf der welt! typische OO programmierung. 

ach keine ahnung ich bin stur und will da nicht diesen scheiss programmieren. ich glaub mir ist nicht zu helfen. sitz schon seit montag an dem scheiss!


----------



## Michael... (4. Sep 2009)

sohell hat gesagt.:


> man soll jedesmal immer dabei pack() aufrufen um die form neu zu zeichnen


 pack() "optimiert" das Layout anhand der einzelnen Komponenten (deswegen rufe ich sowas prinzipiell nicht auf)
Grundsätzlich gilt: Wenn Änderung am Layout vorgenommen werden (Komponenten entfernt, hinzugefügt, versetzt) wenn es bereits sichtbar ist, muss man validate() aufrufen.
Warum fügst Du in Deinem Fall den zweiten Button nicht von Anfang an ein und machst ihn bei Bedarf sichtbar?


----------



## diggaa1984 (4. Sep 2009)

hm vielleicht könnte man dir layout-mäßig helfen wenn du mal ne Skizze machst und das Verhalten bei Änderung beschreibst.

GUI selbst erstellen lernt man auch eben mal nicht in 1 Woche  .. dafür ist das alles viel zu verstrickt, und jede Komponente will anders behandelt werden, aber es ist ein ultimativer Lernprozess sich damit auseinanderzusetzen. Nimm dir die Zeit, sofern vorhanden und Code das per Hand, der Code wird für meine Begriffe auch wesentlich lesbarer.

Ich habe mal eine Gruppe von Studenten geholfen aus Netbeans-GUI-Builder-Code alles rauszuschmeissen was nicht benötigt wurde, und das ganze nochma in Klassen aufgeteilt. Nach 6h und einem anfänglich immer kleiner werdendem Fenster (bis gar nix mehr drin war, obwohl ich haufen add-Anweisungen hatte) .. welches später wieder größer wurde und letztendlich dem Layout entsprach was gewünscht war, war ich echt bedient ^^. Rein wartungstechnisch die Hölle für mich


----------



## sohell (4. Sep 2009)

Michael... hat gesagt.:


> Warum fügst Du in Deinem Fall den zweiten Button nicht von Anfang an ein und machst ihn bei Bedarf sichtbar?


ich hab das mal hier in dem unteren code probiert. ich kann jetzt die eigenschaft von anderen existierenden labels ändern. logisch. 



```
package javaapplication1;


public class NewJFrame extends javax.swing.JFrame {

    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
    }

    @SuppressWarnings("unchecked")

    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("jButton2");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(124, 124, 124)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jButton2)
                    .addComponent(jButton1))
                .addContainerGap(203, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(93, 93, 93)
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton2)
                .addContainerGap(150, Short.MAX_VALUE))
        );

        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        jButton2.show(); // so rum richtig :)
        jButton1.hide();
        jLabel1.setText("button1");
        validate();
        
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        jButton1.show();
        jButton2.hide();
        jLabel1.setText("button2");
        validate();        
    }

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


    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;

}
```


----------



## sohell (4. Sep 2009)

ich hab es auch jetzt den letzten code mit netbeans erstellt und wesentlich benutzerfreundlicher. aber ich versteh einfach den sinn nicht. wieso soll man in solch einem gui editor panels erstellen, und diese nicht so einfach einer form hinzufügen können. wozu dann die aufteilung in panels und forms?? sehr untrivial


----------



## diggaa1984 (4. Sep 2009)

hm also dieser gui-builder diskussion bleib ich mal fern  .. zumal ich auch mit eclipse arbeite. Solange du für dein Panel ne eigene Klasse hast, sollte das imho auch möglich sein dieses einfach irgendwo zu adden.


----------



## Michael... (4. Sep 2009)

- die Aufrufe von validate() brauchst Du hier nicht, da Du nichts am Layout änderst
- ich habe keine Ahnung was eine *Form* ist????


----------



## sohell (4. Sep 2009)

oops zwei mal gepostet. weiter gehts unten!


----------



## sohell (4. Sep 2009)

Michael... hat gesagt.:


> - die Aufrufe von validate() brauchst Du hier nicht, da Du nichts am Layout änderst
> - ich habe keine Ahnung was eine *Form* ist????



eine Form soll das Fenster sein. das ist eine Klasse welche ein Fenster abbildet. panels hingegen ist eine unterform von container und diese kann man nicht durch setVisible anzeigen lassen. 

ich bin dem ziel nahe. und werd nochmal durch ein codebeispiel mein ziel verdeutlichen. es passiert hier bei dem code nicht das gewünschte: nämlich das ein panel zur laufzeit erzeugt wird (welche als Klasse in dem projekt / package importiert ist). 
dann soll dieses Panel der angezeigten Form / Fenster hinzugefügt werden. 
dieses Panel hat mehere Elemente (buttons/und labels)


```
public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();
    }


    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("jButton2");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jLabel1.setText("jLabel1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(124, 124, 124)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(114, 114, 114)
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton1)))
                .addContainerGap(124, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(93, 93, 93)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton2)
                    .addComponent(jButton1))
                .addContainerGap(159, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        jLabel1.setText("button1");
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        jLabel1.setText("button2");
        // [B]hier kommt der entscheidende augenblick!![/B]
        // [COLOR="Red"](3) ich möchte dem frame / Fenster "JF" die componente Panel "jP" hinzufügen[/COLOR]
        
        JF.add(jP, 0); 
        validate();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                // [COLOR="#ff0000"](2) die form wird zur laufzeit angezeigt mit setVisible [/COLOR]
                JF.setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;

    //[COLOR="#ff0000"] (1) die jForm / Fenster und jPanel habe ich global deklariert[/COLOR]
    static NewJFrame JF = new NewJFrame();
    static NewJPanel jP = new NewJPanel();
}
```


----------



## Michael... (4. Sep 2009)

Bin mir immer noch nicht sicher, ob ich Dich richtig verstanden habe.
Hier mal ein Bsp zum Ersetzen (Zeile 14-16) von Komponenten:

```
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

import javax.swing.*;

public class LayoutChangeDemo extends JPanel {
	private JPanel panel;
	public LayoutChangeDemo() {
		this.setLayout(new BorderLayout());
		JButton button = new JButton("Wenn was passieren soll: Hier drücken!!");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				remove(panel);
				add(panel = new RandomPanel(), BorderLayout.CENTER);
				validate();
			}
		});
		this.add(panel = new RandomPanel(), BorderLayout.CENTER);
		this.add(button, BorderLayout.SOUTH);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.getContentPane().add(new LayoutChangeDemo(), BorderLayout.CENTER);
		frame.setVisible(true);
	}
}

class RandomPanel extends JPanel {
	private static Random rnd = new Random();
	private JComponent[] comp = new JComponent[] {new JLabel("Hallo", JLabel.CENTER), new JButton("Drück mich und nichts passiert"), new JComboBox(new Object[] {"nix passiert 1", "nix passiert 2", "nix passiert 3"})};
	private String[] text = new String[] {"Blub", "Blob", "?????????"};
	
	public RandomPanel() {
		this.setLayout(new BorderLayout());
		this.setBackground(new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
		this.add(comp[rnd.nextInt(3)], BorderLayout.NORTH);
		this.add(new JLabel(text[rnd.nextInt(3)], JLabel.CENTER), BorderLayout.CENTER);
	}
}
```


----------



## diggaa1984 (4. Sep 2009)

und dann komm ich wieder und sage .. erzeuge einfach von jedem panel was du jemals anzeigen magst eine instanz bereits in "initComponents" und lass sie dann einfach im Listener und poer CardLayout anzeigen. Das erspart dir removes und validates und sowas alles


----------



## Michael... (4. Sep 2009)

und dann würde ich sagen: Hast Recht!
War ja nur ein Bsp für nachträgliches rumpfuschen im Layout einer Komponente


----------



## sohell (4. Sep 2009)

ganz einfach!
hab hier eine präsentation erstellt! hoffe es versteht jeder jetzt! 
link


----------



## Michael... (4. Sep 2009)

sohell hat gesagt.:


> hab hier eine präsentation erstellt! hoffe es versteht jeder jetzt!


Ich nicht! Mir ist folgendes aufgefallen (Bild 5)

```
remove(jP);
add(jP, BorderLayout.CENTER);
```
wieso entfernst Du die Komponente, um sie dann wieder einzufügen?????

Kannst Du nicht mal ein KSKB posten?


----------



## diggaa1984 (4. Sep 2009)

den link hab ich verstanden und nun der tipp .. das was initial aufm Frame liegt, einfach in eine klasse "startPanel" oder so legen, cardLayout aufs JFrame. dieses startPanel initial anzeigen lassen und fertig der Salat  das JFrame lässt im designer einfach leer, regelst alles per code


----------



## sohell (4. Sep 2009)

Projekt liegt hier

*Main.java: *


```
package javaapplication1;

public class Main {

    public static void main(String[] args) {


            new NewJFrame().setVisible(true);
                NewJFrame JF = new NewJFrame();
                NewJPanel jp = new NewJPanel();

    }

}
```

*NewJFrame.java: *


```
package javaapplication1;

import java.awt.BorderLayout;
import javax.swing.JButton;

public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();
    }

    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("jButton2");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jLabel1.setText("jLabel1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(124, 124, 124)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(114, 114, 114)
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton1)))
                .addContainerGap(124, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(93, 93, 93)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton2)
                    .addComponent(jButton1))
                .addContainerGap(159, Short.MAX_VALUE))
        );

        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        jLabel1.setText("button1");
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        jLabel1.setText("button2");
        JFrame.add(JPanel, BorderLayout.WEST);
        validate();
    }

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

    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;

    static NewJFrame JFrame = new NewJFrame();
    static NewJPanel JPanel = new NewJPanel();
}
```

*NewJPanel.java: *


```
package javaapplication1;


public class NewJPanel extends javax.swing.JPanel {

    /** Creates new form NewJPanel */
    public NewJPanel() {
        initComponents();
    }


    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        jLabel1.setText("jLabel1");

        jButton1.setText("jButton1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(33, 33, 33)
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addComponent(jButton1)
                .addContainerGap(242, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(58, 58, 58)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jButton1))
                .addContainerGap(219, Short.MAX_VALUE))
        );
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;

}
```


----------



## sohell (4. Sep 2009)

Michael... hat gesagt.:


> wieso entfernst Du die Komponente, um sie dann wieder einzufügen?????


 
weil du selber das hier geschrieben hast ich habs mal angepasst. 

```
button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				remove(panel);
				add(panel = new RandomPanel(), BorderLayout.CENTER);
				validate();
			} }); }
```


----------



## Michael... (4. Sep 2009)

sohell hat gesagt.:


> weil du selber das hier geschrieben hast ich habs mal angepasst.
> 
> ```
> button.addActionListener(new ActionListener() {
> ...


Bei mir ist aber panel in Zeile 3 ein ganz anderes Objekt als panel in Zeile 4
Ein bisschen anders geschrieben ist's vielleicht besser erkennbar:

```
button.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent evt) {
		remove(panel);
		panel = new RandomPanel();
		add(panel, BorderLayout.CENTER);
		validate();
	}
 });
```
Auch wenn ich noch nicht ganz weiß, was Du vorhast, bin ich mir ziemlich sicher, dass es in Deinem Fall auch das CardLayout tun würde.


----------



## diggaa1984 (4. Sep 2009)

so, ohne mal das design zu beurteilen (anweisungen für wechsel des contents):

```
public class Main {

	public static void main(String[] args) {
		new NewJFrame().setVisible(true);
	}
}
```


```
import java.awt.BorderLayout;
import javax.swing.JButton;

public class NewJFrame extends javax.swing.JFrame {

	private java.awt.CardLayout cl;
	
	public NewJFrame() {
		super();
		cl = new java.awt.CardLayout();
	    
		initComponents();
	}

	private void initComponents() {
		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setLayout(cl);
	    
		add(new StartPanel(this),"start");
		add(new NewJPanel(),"newJPanel");
	    
		switchContent("start");
		pack();
	}
    
	public void switchContent(String ident) {
		cl.show(getContentPane(),ident);
	}
}
```


```
public class NewJPanel extends javax.swing.JPanel {
	
	/** Creates new form NewJPanel */
	public NewJPanel() {
		super();
		initComponents();
	}


	private void initComponents() {
		jLabel1 = new javax.swing.JLabel();
		jButton1 = new javax.swing.JButton();

		jLabel1.setText("jLabel1");
		jButton1.setText("jButton1");

		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
		this.setLayout(layout);
		layout.setHorizontalGroup(
			layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(layout.createSequentialGroup()
				.addGap(33, 33, 33)
				.addComponent(jLabel1)
				.addGap(18, 18, 18)
				.addComponent(jButton1)
				.addContainerGap(242, Short.MAX_VALUE))
	);
        
		layout.setVerticalGroup(
			layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(layout.createSequentialGroup()
				.addGap(58, 58, 58)
				.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
				.addComponent(jLabel1)
				.addComponent(jButton1))
				.addContainerGap(219, Short.MAX_VALUE))
		);
	}

	private javax.swing.JButton jButton1;
	private javax.swing.JLabel jLabel1;
}
```


```
public class StartPanel extends javax.swing.JPanel {
	
	private javax.swing.JButton jButton1;
	private javax.swing.JButton jButton2;
	private javax.swing.JLabel jLabel1;
	
	private NewJFrame parent;
	
	public StartPanel(NewJFrame parent) {
		super();
		this.parent = parent;
		initComponents();
	}
	
	
	private void initComponents() {
		jButton1 = new javax.swing.JButton();
		jButton2 = new javax.swing.JButton();
		jLabel1 = new javax.swing.JLabel();
		
		jButton1.setText("jButton1");
		jButton1.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton1ActionPerformed(evt);
			}
		});

		jButton2.setText("jButton2");
		jButton2.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton2ActionPerformed(evt);
			}
		});

		jLabel1.setText("jLabel1");
		
	        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
		setLayout(layout);
		layout.setHorizontalGroup(
			layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(layout.createSequentialGroup()
				.addGap(124, 124, 124)
				.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(layout.createSequentialGroup()
				.addGap(114, 114, 114)
				.addComponent(jLabel1))
				.addGroup(layout.createSequentialGroup()
				.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
				.addComponent(jButton2)
				.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
				.addComponent(jButton1)))
				.addContainerGap(124, Short.MAX_VALUE))
		);
        
		layout.setVerticalGroup(
			layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
			.addGroup(layout.createSequentialGroup()
				.addGap(93, 93, 93)
				.addComponent(jLabel1)
				.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
				.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
				.addComponent(jButton2)
				.addComponent(jButton1))
				.addContainerGap(159, Short.MAX_VALUE))
		);
	}
	
	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		jLabel1.setText("button1");
	}

	private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
		jLabel1.setText("button2");
		parent.switchContent("newJPanel");
	}
}
```


----------



## sohell (4. Sep 2009)

gold digger du bist echt ein goldgräber! 
danke dir vielmals mit deinen zeigern und dem cordLayout hat es wunderbar geklappt. 

Ein Lob an dich. Und eine ganz ganz große kritik an all die GUI devoloper von Eclipse. Nein ich suche hier keinen Sündenbock obwohl ich mich hätte besser mit der programmierung beschäftigen müssen. Aber ich hab in einem Projekt schon mal C# programmiert. Hab ein großes Warenwirtschaftssystem erstellt und hab dabei Visual Studio .Net 2005 als IDE benutzt. und da war es nicht so ein problem mit diesen Panels. :noe:

Heutzutage sollte man sich mehr um die Logik kümmern als um diese Designer geschichten und so. Schließlich muss jede (mittelgroße) Anwendung aus Platzgründen solche Aufteilung mit Panels vornehmen. Man kann ja schließlich nicht alle Components in ein Fenster knallen! 

Ich bleib bei Netbeans IDE und werde später einfach den code importieren, um leider mit einem (nur in Eclipse zur Verfügung stehenden Plugin) weiterzuarbeiten..... da kommt noch was auf mich zu. Also Prozessmodellierung und so. Kennt sich einer damit aus bzw kann einer ein gutes Forum empfehlen? Wäre ja zufall wenn! 

Datei liegt hier falls es in Netbeans importiert wird, kann man die panels dort auch bearbeiten! Dank an Golddigger der mich zum Ziel geführt hat!


----------



## diggaa1984 (4. Sep 2009)

> Und eine ganz ganz große kritik an all die GUI devoloper von Eclipse


ich dachte du machst das mit netbeans?


----------



## sohell (4. Sep 2009)

ja seit heute morgen bin ich auf netbeans umgestiegen. hab seit montag bis gestern mit eclipse herumprobiert.


----------

